用户单击 UITableView 中的单元格进行重新排序,我如何知道被拖动单元格的索引和位置?
Posted
技术标签:
【中文标题】用户单击 UITableView 中的单元格进行重新排序,我如何知道被拖动单元格的索引和位置?【英文标题】:User clicks cell in a UITableView to reorder, how can I know the index and location of the cell being dragged? 【发布时间】:2012-11-05 22:40:33 【问题描述】:使用提供的 reorderControls,用户可以点击并按住以拖动单元格以重新排序。我如何知道他们选择了要拖动的单元格以及当前单元格的位置(即,当其他单元格动画为浮动单元格腾出空间时,我想要移动单元格的索引)?
我要做的是滚动视图,以便如果用户希望使用屏幕外单元格重新排序当前单元格,则屏幕外单元格将在屏幕上滚动。我不能使用内置行为,因为我的设置是:
UIScrollView(父级)
UITableView(子)并且 UITableView 框架是其 contentSize 的完整大小(它不滚动)。我需要相对于用户拖动单元格的位置滚动外部 UIScrollView 以在 UITableView 中重新排序。
我尝试查看委托和数据源函数,但到目前为止没有运气。还尝试了谷歌搜索和 Apple 文档...
编辑:好像我无法阅读文档。委托协议中的tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
给了我我需要的东西。
解决方案:创建一个从 tableview 到滚动视图控制器的委托(我的 tableview 是它自己的委托)。在提议的索引路径函数中,我向代理发送了需要变得可见的providedDestinationIndexPath 附近的单元格。如果 indexpath 为 0 或最大值,这可能是该单元格本身。然后在委托中,我使用 [view convertPoint:FromView:] 函数计算该单元格的位置,并设置滚动视图的内容偏移量以使该单元格可见! 谢谢
【问题讨论】:
为什么表格视图是滚动视图?UITableView
是 UIScrollView
?除了表格视图之外,滚动视图中还有其他内容吗?
@rmaddy 是的,还有很多其他的东西,比如 MKMapView、一些标签和图像视图等等。
【参考方案1】:
通常,当您拖动单元格时,表格视图会在您到达顶部或底部时自动滚动。听起来滚动视图的使用阻止了它正常工作,因为表格视图认为它足够大而不能滚动。没有正常的 API 调用可以为您提供所需的答案。
我能想到的唯一能让你接近的事情是tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
表视图委托方法的实现。
proposedIndexPath
可以让您大致了解用户当前拖动行的位置。您可以使用该 indexPath 向表询问路径的CGRect
。然后将其转换为滚动视图的内容视图中的一个位置。
但这远非完美。
另一种可能是将观察者添加到被移动单元格的frame
或center
属性。
【讨论】:
它不起作用是有道理的,因为 UITableView 基本上不能滚动。感谢您提出该方法。我忽略了它,但在文档中它说Every time the dragged row is over a destination, the table view sends tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath: to its delegate (if it implements the method). In this method the delegate may reject the current destination for the dragged row and specify an alternative one.
所以它可能工作:)
哇,太完美了,每次底部单元格动画时它都会收到调用!谢谢。我可以计算该单元格的位置并做一些数学运算来设置 UIScrollView 的 contentOffset以上是关于用户单击 UITableView 中的单元格进行重新排序,我如何知道被拖动单元格的索引和位置?的主要内容,如果未能解决你的问题,请参考以下文章
如何编写 UI 测试来测试单击 UITableView 中的第一个单元格时图像是不是存在?
当 UITableView 单元格中的进度条不可见时,如何更新它们