У меня есть 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