FMMoveTableView完整入门:iOS表格长按拖拽排序库,无需Edit Mode即可重排行
FMMoveTableView完整入门iOS表格长按拖拽排序库无需Edit Mode即可重排行【免费下载链接】FMMoveTableViewDiscontinued: Please use iOS 11s Drag Drop capability instead.项目地址: https://gitcode.com/gh_mirrors/fm/FMMoveTableViewFMMoveTableView 是一款轻量的 iOS 表格拖拽排序库它通过长按即拖的方式让 UITableViewCell 支持拖拽重排行完全不需要进入编辑模式Edit Mode也无需显示烦人的小减号按钮。整个库只有 4 个源文件几分钟就能集成到自己的 App 中。下面带你快速了解它的原理、集成步骤和数据源回调注意事项。⚡ 30 秒认识 FMMoveTableViewFMMoveTableView 本质上是UITableView的一个子类内部额外挂载了一个UILongPressGestureRecognizer长按手势识别器。它的核心能力包括️长按任意一行即可开始拖拽松手完成排序 拖动时显示带阴影的单元格快照原位置内容被清空视觉干净 拖动靠近表格顶部/底部时自动滚动无需手指离开屏幕 提供与系统重排一致风格的回调协议便于更新数据模型示例项目启动后的列表界面如下图所示示例中是一个 Movies 电影列表仓库根目录还附有一段演示动画Sample.gif展示了完整的长按拖拽排序过程。 集成步骤手动添加或 CocoaPods手动集成推荐代码量极小只需把核心源码拷贝进项目即可共 4 个文件文件作用FMFramework/FMMoveTableView.h表格子类与协议定义FMFramework/FMMoveTableView.m拖拽、快照、自动滚动实现FMFramework/FMMoveTableViewCell.hCell 基类定义FMFramework/FMMoveTableViewCell.mCell 移动时的内容重置逻辑同时记得在工程中引入QuartzCore框架快照阴影效果需要用到。CocoaPods在 Podfile 中声明依赖即可库版本为 2.0.3MIT 协议pod FMMoveTableView也可以先克隆仓库查看完整源码和示例git clone https://gitcode.com/gh_mirrors/fm/FMMoveTableView️ 长按拖拽是如何实现的整个交互可以分为三个阶段对应FMFramework/FMMoveTableView.m中的三段核心逻辑1️⃣ 长按启动截取快照手指按住某一行达到长按时长后表格会先询问数据源moveTableView:canMoveRowAtIndexPath:该行是否允许移动。允许的话就会对该单元格截图生成快照加上阴影、略微降低透明度覆盖在表格上方同时调用 Cell 的prepareForMove清空原单元格内容看起来就像这一行被拿起来了。2️⃣ 拖动过程实时重排 自动滚动拖动过程中表格用deleteRowsinsertRows的方式让其他行实时让位。当手指靠近表格上/下边缘阈值约为单元格高度的 60%时内置的NSTimer会以 60fps 的频率自动滚动内容拖动到长列表末尾也不再需要手离开屏幕去滚列表。3️⃣ 松手完成动画归位 通知数据源松手后快照会先以 0.2 秒动画平滑贴合到最终位置然后才回调数据源的moveTableView:moveRowFromIndexPath:toIndexPath:方法——你在里面更新数组模型即可。如果中途手势被取消比如点在 Section 标题上所有改动会被自动还原。 你需要实现的回调方法FMMoveTableView定义了两个协议共 4 个方法命名与系统原生重排回调风格一致回调方法协议是否必须用途moveTableView:moveRowFromIndexPath:toIndexPath:DataSource✅ 必须拖动结束后更新数据模型moveTableView:canMoveRowAtIndexPath:DataSource可选控制某一行能否被拖动moveTableView:willMoveRowAtIndexPath:Delegate可选行即将开始移动时回调moveTableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:Delegate可选拦截并改写目标位置例如禁止跨 Section 移动示例 ViewControllerFMMoveTable/Classes/FMViewController.m完整演示了这 4 个方法的写法照着抄即可。⚠️ 数据源脏状态新手最容易踩的坑这是官方示例中反复用#warning标注的重点拖动过程中数据源是脏的真实数据要等松手后才更新。如果你直接在numberOfRowsInSection:或cellForRowAtIndexPath:里用 indexPath 取数组就会取错数据甚至越界崩溃。正确姿势是取数据前先适配 indexPath调用[tableView adaptedIndexPathForRowAtIndexPath:indexPath]把屏幕上的位置换算回模型中的位置正在移动的行调用[cell prepareForMove]而不是填充内容跨 Section 移动时修正行数目标 Section 1 行、来源 Section -1 行见FMMoveTable/Classes/FMViewController.m中numberOfRowsInSection:的写法。如果你的所有行等高第 3 点和heightForRowAtIndexPath:里的适配检查可以跳过。 项目文件导读FMFramework/— 库本体4 个 .h/.m 文件拷贝这里就够了FMMoveTable/Classes/FMViewController.m— 可直接参考的完整使用示例FMMoveTableView.podspec— CocoaPods 描述文件名称、版本、依赖 QuartzCoreREADME.markdown— 官方说明文档 重要提醒项目已停止维护README.markdown开头明确标注iOS 11 之后UITableView已原生支持 Drag Drop拖放能力官方建议新项目直接使用系统 API 而非 FMMoveTableView。所以它的最佳定位是✅ 需要兼容 iOS 11 以下老版本的存量项目✅ 想体验长按即拖、无需 Edit Mode交互的最小实现范例学习长按手势 快照 自动滚动的实现思路❌ 全新项目建议直接使用 iOS 11 的原生拖放能力理解了这个库的实现原理再去写原生拖放代码思路会清晰很多。【免费下载链接】FMMoveTableViewDiscontinued: Please use iOS 11s Drag Drop capability instead.项目地址: https://gitcode.com/gh_mirrors/fm/FMMoveTableView创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考