[英]Reordering UICollectionView in iOS7
我想构建一个UICollectionView,或使用类似的库来制作网格视图,我可以在其中重新排列单元格。 我的应用程序支持iOS 7,不幸的是UICollectionView
方法 - (BOOL)beginInteractiveMovementForItemAtIndexPath:(NSIndexPath *)indexPath
仅适用于iOS 9及更高版本。
有什么方法可以在iOS7上实现“拖动和重新排序”集合视图单元格的效果吗? 谢谢。
好吧,我碰巧碰到了同样的问题,所以让我加上我的两分钱。
为了获得与UIKit在重新排列细胞时所做的相同的效果,我遵循了下面描述的或多或少类似的方法:
将长按手势识别器添加到集合视图中,这样您就可以检测到哪个单元格被轻敲而不会弄乱collectionView:didSelectItemAtIndexPath
方法。
当用户长按单元格时,获取该单元格的屏幕截图,将快照视图添加到集合视图中,然后隐藏单元格。 当用户在屏幕上移动手指时,更新快照的中心以便以编程方式移动它,使其看起来像用户正在拖动单元格。
诀窍是决定何时以及如何交换细胞。 当快照移动时,它将与其他单元格相交。 当它发生时,你应该更新你的数据源并调用moveItemAtIndexPath
这样它就会交换原始单元格和快照相交的单元格的位置。
拖动结束时,从集合视图中删除快照并显示原始单元格。
您可以将这些步骤映射到手势识别器的状态,以便我们知道您应该在每个州执行的操作:
我在我的github帐户中放了一个示例项目 ,因此您可以下载并使用它。 在这里,我将实现手势回调:
注意:下面的代码可能不起作用,因为我丢弃了一些特定于实现的细节。 但它应该表明基本意图。 请从我的github repo下载完整代码。
func longPressRecognized(recognizer: UILongPressGestureRecognizer) {
let location = recognizer.locationInView(collectionView)
let indexPath = collectionView.indexPathForItemAtPoint(location)
switch recognizer.state {
case .Began:
let cell = collectionView.cellForRowAtIndexPath(indexPath)
let snapshotView = cell.snapshotViewAfterScreenUpdates(true)
snapshot.center = cell.center
collectionView.addSubview(snapshotView)
cell.contentView.alpha = 0.0 // hides original cell
case .Changed:
snapshotView.center = location // will follow user's finger.
dataSource.swap(originalCellIndexPath.item, indexPath.item) // swaps data
collectionView.moveItemAtIndexPath(originalCellIndexPath, toIndexPath: indexPath) // swaps cells
originalCellIndexPath = indexPath
default:
let cell = cellForRowAtIndexPath(originalCellIndexPath)
cell.contentView.alpha = 1.0
snapshotView.removeFromSuperview()
}
}
以下是您将获得的效果(在iOS 8.4模拟器上录制) :
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.