Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用自定义UICollectionViewLayout无缝移动隐藏的UICollectionViewCell_Swift_Uicollectionview_Uicollectionviewcell_Uicollectionviewlayout - Fatal编程技术网

Swift 使用自定义UICollectionViewLayout无缝移动隐藏的UICollectionViewCell

Swift 使用自定义UICollectionViewLayout无缝移动隐藏的UICollectionViewCell,swift,uicollectionview,uicollectionviewcell,uicollectionviewlayout,Swift,Uicollectionview,Uicollectionviewcell,Uicollectionviewlayout,我实现了一种自定义机制,使用uilongpressurerecognizer在UICollectionView中拖放来执行重新排序 我有一个非常简单的习惯。 我的布局类不是的子类 下面是它的样子: 当我开始提升单元格开始拖动时,我会更新自定义布局对象中的dropProposalIndexPath属性,以便它知道需要隐藏哪个单元格 我的自定义UICollectionViewLayout子类返回一个UICollectionViewLayoutAttributes,对应于dropProposalIn

我实现了一种自定义机制,使用
uilongpressurerecognizer
UICollectionView
中拖放来执行重新排序

我有一个非常简单的习惯。
我的布局类不是的子类

下面是它的样子:

当我开始提升单元格开始拖动时,我会更新自定义布局对象中的
dropProposalIndexPath
属性,以便它知道需要隐藏哪个单元格

我的自定义
UICollectionViewLayout
子类返回一个
UICollectionViewLayoutAttributes
,对应于
dropProposalIndexPath
的单元格的
alpha
属性设置为0,如下所示:

如果self.dropProposalIndexPath==indexPath{
ItemLayoutAttribute.alpha=0
}
它使提升的单元格隐藏,从而在
UICollectionView
中创建一个“孔”

当用户移动其手指时,我更新我的自定义
UICollectionViewLayout
子类的
dropProposalIndexPath
属性并使其布局无效,然后移动在新索引处用作孔的单元格:

//将dropProposal的indexPath通知布局
self.reorderablellayout?.dropProposalIndexPath=dropProposalIndexPath
//移动单元格
collectionView.moveItem(位于:DragginIndexPath,至:dropProposalIndexPath)
下面是它的外观:

很糟糕吧

我在一个演示项目中使用
UICollectionViewFlowLayout
的子类实现了完全相同的逻辑,并且过渡是无缝的:

我猜我做错了什么,或者忘记在我的
UICollectionViewLayout
子类中做什么了

如果需要,我可以发布更多代码



请注意,使用内置拖放机制(iOS 11引入)执行重新排序不是一个选项,出于各种原因,我希望使用自定义实现。

如果有人遇到相同问题,解决方案是在
UICollectionViewLayout
子类中实现以下方法:

func InitialLayoutAttribute for AppearinGitem(位于:IndexPath)->UICollectionViewLayoutAttribute?
然后,如果
itemIndexPath
参数与拖动单元格的indexPath匹配,则在
initiallayouttributesforappearingitem
函数中返回
uicollectionviewlayouttributes
,并将
alpha
属性设置为
0