美文网首页
Swift拖拽交换位置

Swift拖拽交换位置

作者: 玉思盈蝶 | 来源:发表于2020-07-03 17:00 被阅读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

相关文章

  • Swift拖拽交换位置

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

  • 【转载】vue实现拖拽交换位置

    原文:vue实现拖拽交换位置[https://blog.csdn.net/ziwoods/article/deta...

  • flutter-两个列表之间元素拖拽

    首先需要完成一个GridView内的元素拖拽交换位置; 然后解决两个GridView之间拖拽的数据问题.(List...

  • tableViewCell拖拽移动并且交换

    开发过程中,可能会遇上要求拖拽cell,移动到指定的位置,然后交换cell的位置。tableView协议可以满足,...

  • Swift数组元素位置交换

    第一种方法 第二种方法 第三种方法 第四种方法 第五种方法

  • 拖拽交换

    面试的时候碰到过这样一个问题 目录结构用以下的html文件 首先是右键的自定义点击事件,事件名为contextme...

  • 数组中插入一个元素

    数组两项元素交换位置 把数组里的某一项移动到某一位置(常见拖拽的时候drop函数里用)

  • Excel基本使用第一天

    1,交换两列位置操作:shift+鼠标箭头放到表格线上出现十字图标时,拖拽。2,快速定位到表头或表尾:鼠标放到单元...

  • HTML5拖拽drag

    通过拖拽实现页面元素的位置改变 实现拖拽效果 源元素 - 要拖拽的文件 目标元素 - 要拖拽到哪里去 目前实现拖拽...

  • RecyclerView item拖拽交换

    之前在项目中自己做过recyclerView列表item交换功能,顾记录下来。 演示效果: 实现方式主要是围绕It...

网友评论

      本文标题:Swift拖拽交换位置

      本文链接:https://www.haomeiwen.com/subject/dmasqktx.html