重新sortingUITableView无需重新sorting控制

我需要用户能够通过这种方式重新sortingUITableView:他触摸一个单元格预定的时间(例如1秒),然后他可以拖放到其他单元格。

我知道如何使用手势识别器来实现“长时间触摸”检测,但是如果不使用重新sorting控件来实现拖放function,最好的方法是什么?(用户应该从单元格中的任何位置拖动单元格,重新sorting控制)?

我解决了以下步骤的问题:

  1. 将手势识别器附加到UITableView。
  2. 通过“长时间触摸”来检测哪个单元被点击。 在这一刻创build一个选定的单元格的快照,把它放到UIImageView并把它放在UITableView。 UIImageView的坐标应该math选定的单元格相对于UITableView(所选单元格的快照应覆盖选定的单元格)。
  3. 存储选定单元格的索引,删除选定的单元格并重新加载UITableView。
  4. 禁用UITableView的滚动。 现在当你拖动单元格时,你需要改变快照UIImageView的框架。 你可以在touchesMoved方法中做到这一点。
  5. 当用户手指离开屏幕时,创build新的单元格并重新加载UITableView(您已经存储了索引)。
  6. 删除快照UIImageView。

但要做到这一点并不容易。

为了将来的参考…我有同样的问题,我发现了另一个问题( Swift – 拖放TableViewCell与长手势识别器 ),有人build议这个教程: https : //www.freshconsulting.com/create-drag-和drop-uitableview-swift /为我工作完美

从任何接触点重新sortingUITableViewCell的文章讨论了这个确切的情况。

本质上,你做以下几点:

  1. findUITableViewCellReorderControl (一个私人类)。
  2. 展开它,以便跨越整个单元格。
  3. 把它藏起来。
  4. 用户现在可以从任何地方拖动单元格。

Cookbook:用长按手势移动表格视图单元格的另一个解决scheme通过执行以下操作来实现相同的效果:

  1. 在表格视图中添加一个长按手势识别器。
  2. 单元格被拖动时创build单元格的快照。
  3. 当单元格被拖动时,移动快照,并调用-[UITableView moveRowAtIndexPath:toIndexPath:]
  4. 当手势结束时,隐藏单元快照。

这是一个老问题,但是这里有一个解决scheme已经过testing,可以使用iOS 811

在你的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版本,它似乎都能正常工作,但是每当新的操作系统出现时,您都必须确保它仍然有效。