iOS 列表拖拽cell排序

先看效果:

拖拽cell排序

一、 UITableView有自带的cell拖拽排序功能,但是有个缺点,拖拽平移的手势只能在cell的最右侧,拖拽按钮上的图标也不方便更换,在此不在细说;

二、使用UICollectionView实现cell拖拽排序

视频中的效果是使用UICollectionView实现的;

UICollectionView部分的代码不再写了,就是常规的实现;以下只把拖拽手势实现的逻辑贴出来,仅供参考:

1、在listView: UICollectionView!上添加PanGesture手势:

复制代码
        self.listView.register(UINib(nibName: "RecordListCVCell", bundle: nil), forCellWithReuseIdentifier: "RecordListCVCell")
        self.listView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .vertical
        layout.itemSize = CGSize(width: ScreenWidth - 32, height: 55)
        self.listView.collectionViewLayout = layout
        self.listView.reloadData()
        
        panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
        panGesture!.isEnabled = true
        panGesture!.delegate = self
        self.listView.addGestureRecognizer(panGesture!)片

2、在UIGestureRecognizerDelegate代理方法中限制手势的作用范围:

这一步主要是防止 panGesture 与 listView滚动冲突

复制代码
//限制拖拽手势的作用范围:仅左侧60pt宽度区域有效
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        guard gestureRecognizer == panGesture,
              let pan = gestureRecognizer as? UIPanGestureRecognizer else {
            return true
        }
        // 1. 获取触摸点坐标
        let touchPoint = pan.location(in: listView)
        // 2. 区域限制:仅左侧60pt宽度区域有效
        guard touchPoint.x < 60 else {
            return false // 超出区域不响应
        }
        return true
    }

3、cell的平移操作:

复制代码
//平移
    @objc func handlePanGesture(_ panPress: UIPanGestureRecognizer) {
        switch panPress.state {
        case .began:
            // 手势作用的位置
            if let selectIndexPath = listView.indexPathForItem(at: panPress.location(in: listView)) {
                // 找到当前的 cell
                if let _ = listView.cellForItem(at: selectIndexPath) as? RecordListCVCell {
                    // 开始移动
                    listView.beginInteractiveMovementForItem(at: selectIndexPath)
                }
            }
            break
        case .changed:
            // 更新移动的位置:只移动Y,移动时cell的中心点X会跑到0点位置,所以要 x = (ScreenWidth - 32) / 2.0  纠正过来
            listView.updateInteractiveMovementTargetPosition(CGPoint(x: (ScreenWidth - 32) / 2.0, y: panPress.location(in: panPress.view).y))
            break
        case .ended:
            // 结束移动
            listView.endInteractiveMovement()
            break
        default:
            listView.cancelInteractiveMovement()
            break
        }
    }

4、在UICollectionViewDataSource代理中实现数据源的重新排序:

复制代码
func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath){
        //拖拽排序:更新数据源顺序
        let element = dataList.remove(at: sourceIndexPath.row)
        dataList.insert(element, at: destinationIndexPath.row)
        self.listView.reloadData()
    }
相关推荐
茶底世界之下9 小时前
Metal 冷启动并发下,Pipeline Cache 为什么必须合并在途编译
ios·swift
weixin_4038101310 小时前
用 Python 调 EasyClick iOS 免越狱脚本:开放接口对接步骤与参数
ios·iphone
weixin_4038101312 小时前
EasyClick iOS 免越狱自动化脚本怎么写:从环境判断到跑通第一个脚本
运维·ios·自动化
weixin_4038101314 小时前
不用越狱也能批量控制 iPhone:EasyClick iOS 免越狱脚本实战
ios·iphone
weixin_4038101314 小时前
iOS 自动化脚本怎么输入文字:代理、输入法与快捷指令三级方案
运维·ios·自动化
黑科技iOS上架2 天前
双引擎解决oc/swift开发引用加固难题
开发语言·ios·swift·审核·ios混淆·执行程序差异化
wechatbot8882 天前
企微第三方自动化开发:原生能力无阉割 API 开放平台介绍
后端·ios·微信·企业微信·ai编程·ipad
黑科技iOS上架2 天前
iOS framework/dylib动态库定向加固实战
macos·ios·objective-c·cocoa·审核·ios混淆·执行程序差异化
可乐鸡翅yeah_2 天前
fmp4 碎片 MP4 格式 HLS 流,和传统 TS 分片有什么不一样
开发语言·javascript·ios·音视频·safari·m3u8·m3u8在线播放