![](/img/trans.png)
[英]UITableView reordering cells in UIViewController - reorder control not showing
[英]Reordering UITableView without reorder control
我需要用户能够通过这种方式重新排序UITableView:他触摸一个单元格预定的时间段(例如1秒),然后他可以将其拖放到其他单元格上。
我知道如何使用手势识别器实现“长触摸”检测,但是在不使用重新排序控件的情况下实现拖放功能的最佳方法是什么(用户应该从单元格中的任何位置拖动单元格,而不仅仅是重新排序控制)?
这是一个老问题,但这是一个经过测试并使用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的第一个建议,但他引用的文章似乎不再有效。
你所做的,是使重新排序控制和单元格的内容视图在编辑时与整个单元格一样大。 这样,您可以从单元格内的任何位置拖动,并且您的内容会占用整个空间,就好像根本没有编辑单元格一样。
最重要的缺点是,您正在改变系统的单元视图结构并引用私有类( UITableViewCellReorderControl )。 它似乎适用于所有最新的iOS版本,但您必须确保每次新的操作系统出现时它仍然有效。
我解决了以下步骤的问题:
touchesMoved
方法中做到这一点。 但要做到这一点并不容易。
从任何接触点重新排序UITableViewCell的文章讨论了这个确切的场景。
基本上你做了以下事情:
UITableViewCellReorderControl
(私有类)。 另一个解决方案, Cookbook:使用长按手势移动表格查看单元格,通过执行以下操作实现相同的效果:
-[UITableView moveRowAtIndexPath:toIndexPath:]
。 为了将来的参考......我遇到了同样的问题,我发现了另一个问题( Swift - 拖放TableViewCell with Long Gesture Recognizer ),有人建议这个教程: https : //www.freshconsulting.com/create-drag- and-drop-uitableview-swift /对我来说非常合适
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.