我知道iOS 11为collectionview带来了新的拖放功能,但我有一个完全独立的问题。所以我想我会尝试使用IOS 9中引入的旧方法(see this link)。我的问题是,在iOS 11上,当手指被移除时,结束动画仅在切换两个单元格时才会出现奇怪现象。您可以在此clip中看到问题。
我一直试图弄清楚这几天,没有运气。它适用于iOS 10但不适用于iOS 11.任何帮助都将受到赞赏。
额外信息:我正在使用带有长按手势的集合视图来启动重新排序手势,如第一个链接中所示。但是,使用uicollectionviewcontroller时仍会出现问题
以下是长按手势的代码:
func handleLongGesture(gesture: UILongPressGestureRecognizer) {
switch(gesture.state) {
case .began:
guard let selectedIndexPath = self.collectionView.indexPathForItem(at: gesture.location(in: self.collectionView)) else {
break
}
collectionView.beginInteractiveMovementForItem(at: selectedIndexPath)
case .changed:
collectionView.updateInteractiveMovementTargetPosition(gesture.location(in: gesture.view!))
case .ended:
// this part misbehaves on ios 11 when two cells are swapped
collectionView.performBatchUpdates({
self.collectionView.endInteractiveMovement()
)}
default:
collectionView.cancelInteractiveMovement()
}
}
答案 0 :(得分:1)
首先,您不需要将collectionView.endInteractiveMovement()
放在performBatchUpdates
块内。但是,这个问题对我来说也是一个烦恼。 iOS 10和11之间的差异以及endInteractiveMovement
这个事情并没有多大意义。
对于我的问题,我在我的collectionView上面放置一个假快照单元格,并在我执行手势状态更改和updateInteractiveMovementTargetPosition
时隐藏下面的内容。一旦手势状态为.ended
,我 从超视图中移除假单元格,然后执行endInteractiveMovement
。但是现在使用iOS 11,我在上一个答案的评论中遇到了与@prolfe相同的问题。由于这个无法预料的重新加载有问题的细胞,我得到了这种奇怪的闪光。
我最终采用的解决方案是延迟我的假细胞去除,以便它有点掩盖'闪光。
我的pushBackView
方法将假单元格设置回放置位置,然后移除假单元格。然后我制定了延迟:
case .ended:
fakeCellView?.pushBackView { [weak self] in // 'suppress' cell animation
DispatchQueue.main.asyncAfter(deadline: .seconds(0.01), execute: {
self?.fakeCellView?.removeFromSuperview()
})
self?.collectionView?.endInteractiveMovement()
}
希望这有帮助!
答案 1 :(得分:0)
无需在performBatchUpdates块中执行self.collectionView.endInteractiveMovement()
。