我实现了一个自定义机制,使用aUICollectionView
中的拖放和aUILongPressGestureRecognizer
执行重新排序。
我有一个非常简单的UICollectionView
自定义UICollectionViewLayout
。
我的布局类不是UICollectionViewFlowLayout
的子类。
下面是它的样子:
当我开始提升单元格以开始拖动时,我会更新自定义布局对象中的dropProposalIndexPath
属性,以便它知道需要隐藏哪个单元格。
我的自定义UICollectionViewLayout
子类返回一个UICollectionViewLayoutAttributes
,其中alpha
属性设置为0,对应于dropProposalIndexPath
的单元格如下:
if self.dropProposalIndexPath == indexPath {
itemLayoutAttributes.alpha = 0
}
它将提升的单元格隐藏起来,从而在
UICollectionView
中创建一个“洞”。当用户移动手指时,我更新自定义子类的
dropProposalIndexPath
属性并使其布局无效,然后移动充当新indexPath处的孔的单元格:// Inform layout of the indexPath of the dropProposal
self.reorderableLayout?.dropProposalIndexPath = dropProposalIndexPath
// Move the cell
collectionView.moveItem(at: draggingIndexPath, to: dropProposalIndexPath)
下面是它的外观:
很糟糕吧?
我在一个演示项目中使用
UICollectionViewLayout
的子类实现了完全相同的逻辑,并且转换是无缝的:我想我做错了什么,或者忘了在我的
UICollectionViewFlowLayout
子类中做些什么。如果需要,我可以发布更多的代码。
请注意,使用内置的拖放机制(iOS 11引入)执行重新排序不是一个选项,我想使用我的自定义实现有各种原因。
最佳答案
如果有人遇到相同的问题,解决方案是在UICollectionViewLayout
子类中实现以下方法:
func initialLayoutAttributesForAppearingItem(at: IndexPath) -> UICollectionViewLayoutAttributes?
然后,如果
UICollectionViewLayoutAttributes
参数与拖动单元格的indexPath匹配,则返回alpha
,并在0
函数中将initialLayoutAttributesForAppearingItem
属性设置为itemIndexPath
。关于swift - 使用自定义UICollectionViewLayout无缝移动隐藏的UICollectionViewCell,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57903294/