如何实现iOS 9的UICollectionView交互式移动功能?

时间:2016-10-21 04:17:55

标签: ios swift layout uicollectionview uikit

iOS 9添加了一个能力点击并按住以轻松重新排列集合视图单元格。在琐碎的情况下启用此功能非常简单。只需在UICollectionViewController上实现一项功能。

func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath)

如果您想了解有关该功能的更多文档,请参阅UICollectionViewDataSource中的定义。

这并不是只使用自定义布局。如果让它在更复杂的情况下工作需要什么?

1 个答案:

答案 0 :(得分:1)

没有详细记录,但有2个强制性覆盖才能正常工作。在UICollectionViewLayout子类中实现以下2个函数

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    return self.itemAttributes.filter { $0.frame.intersects(rect) }
}

首先,您需要确保将布局中的项属性过滤为仅 包含给定rect中的属性。如果你包含更多内容,就会感到困惑。

override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
    return self.itemAttributes.first(where: { $0.indexPath.item == indexPath.item })
}

不确定为什么这是必要的,你认为UIKit可以根据之前的调用推断出正确的属性,但它不能。无论如何,您只需要能够获取给定indexPath的正确属性。