UICollectionViewLayout

UICollectionViewLayout

我实现了一个自定义机制,使用aUICollectionView中的拖放和aUILongPressGestureRecognizer执行重新排序。
我有一个非常简单的UICollectionView自定义UICollectionViewLayout
我的布局类不是UICollectionViewFlowLayout的子类。
下面是它的样子:
swift - 使用自定义UICollectionViewLayout无缝移动隐藏的UICollectionViewCell-LMLPHP
当我开始提升单元格以开始拖动时,我会更新自定义布局对象中的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)

下面是它的外观:
swift - 使用自定义UICollectionViewLayout无缝移动隐藏的UICollectionViewCell-LMLPHP
很糟糕吧?
我在一个演示项目中使用UICollectionViewLayout的子类实现了完全相同的逻辑,并且转换是无缝的:
swift - 使用自定义UICollectionViewLayout无缝移动隐藏的UICollectionViewCell-LMLPHP
我想我做错了什么,或者忘了在我的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/

10-09 18:30