我有一个CollectionView,其中的单元格具有全宽和动态(自动布局计算)高度。
我这样做是通过设置估计的高度:
flowLayout.estimatedItemSize = CGSize(width: 200, height: 10)
然后在委托方法中返回完整宽度和任意高度。
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: collectionView.bounds.width, height: 10)
}
然后在单元格中执行以下操作:
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
setNeedsLayout()
layoutIfNeeded()
let size = self.systemLayoutSizeFitting(layoutAttributes.size)
var newFrame = layoutAttributes.frame
// note: don't change the width
newFrame.size.height = ceil(size.height)
layoutAttributes.frame = newFrame
return layoutAttributes
}
一切都按预期进行...像元一样大小的单元格!太好了!
现在,我想添加重新排序... 我添加了一个GestureRecognizer,并使其重新排列了我的单元格。
@objc func handleLongPress(gestureRecognizer: UILongPressGestureRecognizer) {
guard let view = gestureRecognizer.view else { return }
let location = gestureRecognizer.location(in: view)
switch gestureRecognizer.state {
case .began:
guard let selectedIndexPath = collectionView.indexPathForItem(at: location) else { break }
collectionView.beginInteractiveMovementForItem(at: selectedIndexPath)
case .changed:
collectionView.updateInteractiveMovementTargetPosition(location)
case .ended:
collectionView.endInteractiveMovement()
default:
collectionView.cancelInteractiveMovement()
}
}
这基本上也可以工作...但是在重新排序期间,我的单元格产生了奇怪的动画……这些单元格有时会缩小到我的大小10,但不会让该单元格自行测量。放开阻力后,它又可以工作了……
我注意到,当我缓存CollectionViewCells的高度时,它会好一点,但是对于我之前从未见过的所有单元格,它将再次是10点高的单元格。
在重新排序期间,为了使单元格大小正确,我缺少什么?
我还有一个示例项目,该问题可以在这里找到:https://www.dropbox.com/s/ya6zald4wa6kg10/CollectionViewTester.zip?dl=0