我希望能够在我的集合视图中重新排序单元格,但是在重新排序期间,将正在移动图像的单元格缩小到较小的大小。我能够在移动时让细胞调整大小但是当细胞穿过另一个细胞并尝试重新排序时会出现问题。当细胞到达另一个细胞时,它会暂时恢复正常大小,在移动细胞时会出现闪烁。
我已按照this blog description使用Apple的方法以交互方式重新排序UICollectionView中的单元格。我正在使用的方法列在this page的“交互式重新排序项目”部分下。
我有一个UICollectionView子类,一个UICollectionViewCell子类,以及UICollectionViewDelegateFlowLayout,UICollectionViewDataSource和UICollectionViewDelegate的扩展。
我调整单元格大小的方法是在我的单元格的子类中添加一个布尔值,默认情况下设置为false,但在开始和更新单元格移动时为true,在结束或取消时返回false。在我的UICollectionViewDelegateFlowLayout扩展的sizeForItem方法中,我正在检查布尔值并相应地返回一个大小。
当单元格的图像在一瞬间恢复到正常大小时,很难调试方法显示大小的位置,导致闪烁行为,因为多次调用每个方法以平滑地更新运动。 / p>
我没有以这种方式调整单元格的大小,如果它是问题的原因,我只是不确定如何调整它并防止它在跨越集合视图中的其他单元格时闪烁。
提前感谢您提出任何建议。
更新 一些代码示例。
我更新了beginInteractiveMovementForItem中imageView边界的大小,以便最初缩小它。当collectionview调用update方法时,大小会被重置,但是单元格从sizeForItem获得它的大小,下面是我的逻辑。
作为旁注,除了imageView的边界之外,我还尝试在beginInteractiveMovement中调整单元格边界的大小,但它没有效果,所以我删除了它。
以下是我正在处理调整imageView的方法:
在集合视图的父级中:
@objc func handleLongGesture(_ sender: UILongPressGestureRecognizer) {
switch(sender.state) {
case .began:
let location = sender.location(in: self.collectionView)
guard let selectedIndexPath = self.collectionView.indexPathForItem(at: location) else {
return
}
guard let dragCell = collectionView.cellForItem(at: selectedIndexPath) as? ActivityPhotoGalleryCell else { return }
UIView.animate(withDuration: 0.17, animations: {
dragCell.center = location
})
collectionView.beginInteractiveMovementForItem(at: selectedIndexPath)
case .changed:
collectionView.updateInteractiveMovementTargetPosition(sender.location(in: sender.view))
case .ended:
collectionView.endInteractiveMovement()
default:
collectionView.cancelInteractiveMovement()
}
}
在集合视图子类中:
override func beginInteractiveMovementForItem(at indexPath: IndexPath) -> Bool {
guard let dragCell = cellForItem(at: indexPath) as? CustomCellObject else { return false }
draggingCell = dragCell
dragCell.isDragging = true
return super.beginInteractiveMovementForItem(at: indexPath)
}
以下是项目逻辑的大小:
var sizeForItem = CGSize(width: widthPerItem, height: widthPerItem)
let cell = collectionView.cellForItem(at: indexPath) as? CustomCellObject
if (cell?.isDragging ?? false) {
sizeForItem.height *= 0.7
sizeForItem.width *= 0.7
}
return sizeForItem