重新sortingUITableView无需重新sorting控制
我需要用户能够通过这种方式重新sortingUITableView:他触摸一个单元格预定的时间(例如1秒),然后他可以拖放到其他单元格。
我知道如何使用手势识别器来实现“长时间触摸”检测,但是如果不使用重新sorting控件来实现拖放function,最好的方法是什么?(用户应该从单元格中的任何位置拖动单元格,重新sorting控制)?
我解决了以下步骤的问题:
- 将手势识别器附加到UITableView。
- 通过“长时间触摸”来检测哪个单元被点击。 在这一刻创build一个选定的单元格的快照,把它放到UIImageView并把它放在UITableView。 UIImageView的坐标应该math选定的单元格相对于UITableView(所选单元格的快照应覆盖选定的单元格)。
- 存储选定单元格的索引,删除选定的单元格并重新加载UITableView。
- 禁用UITableView的滚动。 现在当你拖动单元格时,你需要改变快照UIImageView的框架。 你可以在
touchesMoved
方法中做到这一点。 - 当用户手指离开屏幕时,创build新的单元格并重新加载UITableView(您已经存储了索引)。
- 删除快照UIImageView。
但要做到这一点并不容易。
为了将来的参考…我有同样的问题,我发现了另一个问题( Swift – 拖放TableViewCell与长手势识别器 ),有人build议这个教程: https : //www.freshconsulting.com/create-drag-和drop-uitableview-swift /为我工作完美
从任何接触点重新sortingUITableViewCell的文章讨论了这个确切的情况。
本质上,你做以下几点:
- find
UITableViewCellReorderControl
(一个私人类)。 - 展开它,以便跨越整个单元格。
- 把它藏起来。
- 用户现在可以从任何地方拖动单元格。
Cookbook:用长按手势移动表格视图单元格的另一个解决scheme通过执行以下操作来实现相同的效果:
- 在表格视图中添加一个长按手势识别器。
- 单元格被拖动时创build单元格的快照。
- 当单元格被拖动时,移动快照,并调用
-[UITableView moveRowAtIndexPath:toIndexPath:]
。 - 当手势结束时,隐藏单元快照。
这是一个老问题,但是这里有一个解决scheme已经过testing,可以使用iOS 8到11 。
在你的UITableViewCell子类中试试这个:
class MyTableViewCell: UITableViewCell { weak var reorderControl: UIView? override func layoutSubviews() { super.layoutSubviews() // Make the cell's `contentView` as big as the entire cell. contentView.frame = bounds // Make the reorder control as big as the entire cell // so you can drag from everywhere inside the cell. reorderControl?.frame = bounds } override func setEditing(_ editing: Bool, animated: Bool) { super.setEditing(editing, animated: false) if !editing || reorderControl != nil { return } // Find the reorder control in the cell's subviews. for view in subviews { let className = String(describing: type(of:view)) if className == "UITableViewCellReorderControl" { // Remove its subviews so that they don't mess up // your own content's appearance. for subview in view.subviews { subview.removeFromSuperview() } // Keep a weak reference to it for `layoutSubviews()`. reorderControl = view break } } } }
这与Senseful的第一个build议很接近,但是他所引用的文章似乎不再有效。
你所做的是在编辑时使重sorting控制和单元格的内容视图与整个单元一样大。 这样,您可以从单元格内的任何位置进行拖动,并且您的内容占据了整个空间,就好像该单元格根本不被编辑。
最重要的缺点是你正在改变系统的单元视图结构和引用一个私有类( UITableViewCellReorderControl )。 对于所有最新的iOS版本,它似乎都能正常工作,但是每当新的操作系统出现时,您都必须确保它仍然有效。