繁体   English   中英

无需重新排序控制即可重新排序UITableView

[英]Reordering UITableView without reorder control

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

我知道如何使用手势识别器实现“长触摸”检测,但是在不使用重新排序控件的情况下实现拖放功能的最佳方法是什么(用户应该从单元格中的任何位置拖动单元格,而不仅仅是重新排序控制)?

这是一个老问题,但这是一个经过测试并使用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的第一个建议,但他引用的文章似乎不再有效。

你所做的,是使重新排序控制和单元格的内容视图在编辑时与整个单元格一样大。 这样,您可以从单元格内的任何位置拖动,并且您的内容会占用整个空间,就好像根本没有编辑单元格一样。

最重要的缺点是,您正在改变系统的单元视图结构并引用私有类( UITableViewCellReorderControl )。 它似乎适用于所有最新的iOS版本,但您必须确保每次新的操作系统出现时它仍然有效。

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

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

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

从任何接触点重新排序UITableViewCell的文章讨论了这个确切的场景。

基本上你做了以下事情:

  1. 找到UITableViewCellReorderControl (私有类)。
  2. 展开它,使其跨越整个单元格。
  3. 把它藏起来。
  4. 用户现在可以从任何地方拖动单元格。

另一个解决方案, Cookbook:使用长按手势移动表格查看单元格,通过执行以下操作实现相同的效果:

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

为了将来的参考......我遇到了同样的问题,我发现了另一个问题( Swift - 拖放TableViewCell with Long Gesture Recognizer ),有人建议这个教程: https//www.freshconsulting.com/create-drag- and-drop-uitableview-swift /对我来说非常合适

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM