Swift拖拽交换位置

2020-07-03  本文已影响0人  玉思盈蝶

项目里需要实现“田”字格视图拖拽交换四个格锅底数据,今天实现了发现还是蛮容易的,但是自己确实开始不知道如何下手。记录一下吧。

代码如下:

// 获取手势当前位置
let point = panrecognier.location(in: UIApplication.shared.keyWindow)
for currentItem in modelArray{
// 转换point在keyWindow的自定义视图的point
if let tempPoint = UIApplication.shared.keyWindow?.convert(point, to: currentItem.view) {
// 判断是否在view范围内
if currentItem.view.layer.contains(tempPoint){
if let replaceModel = currentItem.dishViewModel{
    if currentItem.isReplace {
        //之前有锅底的调用替换成功
        if let delegate = delegate {
        // 代理回调给控制器交换数据
          let success = delegate.exchangeSuccess(model: replaceModel, replacedModel: item.dishViewModel!, index: currentItem.index, replacedIndex: item.index)
            if success {
            // 交换完成更新当前视图展示数据
                let tempDishViewModel = currentItem.dishViewModel?.copyDishViewModel()
                currentItem.dishViewModel = item.dishViewModel
                modelArray[item.index].dishViewModel = tempDishViewModel
            }
        }
    }
}
}
}
}

笔记:

1、pan手势:
// 拖拽
- (void)setUpPan
{
    // 拖拽
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];

    [self.imageView addGestureRecognizer:pan];
}

- (void)pan:(UIPanGestureRecognizer *)pan
{
    //获取偏移量
    // 返回的是相对于最原始的手指的偏移量
    CGPoint transP = [pan translationInView:self.imageView];

    // 移动图片控件
    self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, transP.x, transP.y);

    // 复位,表示相对上一次
    [pan setTranslation:CGPointZero inView:self.imageView];
}
2、获取位置坐标:
locationInView:指手第一次按下时触发点相对于屏幕的坐标

translationInView:向左滑动/向右滑动时,相对于触发点的偏移量

比如:

location.x=50;translation.x=50;表示触发点.x=50,向右偏移50,当前手势松开的触发点x坐标50+50=100;
location.x=100;translation.x=-50;表示触发点.x=100,向左偏移50,当前手势松开的触发点x坐标100-50=50;
3、注意Model类复制注意引用问题;
4、视图赋值考虑Model处理:显示直接赋值dishViewModel,didSet处理即可。
class ShowPotModel {
    var index : Int = 0
    var isReplace = true

    var dishViewModel : DishViewModel?{
        didSet{
            let url = dishViewModel?.dishModel.planeImageUrl ?? ""
            if url.isEmpty {
                imageView.kf.cancelDownloadTask()
                imageView.image = nil
            }else{
                let transition = CATransition()
                transition.type = CATransitionType(rawValue: "rippleEffect")
                transition.duration = 1.5
                imageView?.layer.add(transition, forKey: nil)
                if let image = ImageDownLoader.shared.retrieveImageInMemoryCache(forKey: url) {
                    imageView.image = image
                } else {
                imageView?.kf.setImage(with: URL(string: url), options: nil, progressBlock: nil, completionHandler: nil)
                }
            }
        }
    }
    //考虑用weak
    weak var imageView: UIImageView!
    weak var view : UIView!
}

参考链接:

iOS手势-UIPanGestureRecognizer:

https://www.jianshu.com/p/33e8dab5d11b

如何判断UIPanGestureRecognizer的拖动方向:

https://www.cnblogs.com/jlwang/p/5241349.html

上一篇 下一篇

猜你喜欢

热点阅读