Ios 同时反弹UIVCollectionView和重新加载节时出现动画问题

Ios 同时反弹UIVCollectionView和重新加载节时出现动画问题,ios,swift,uikit,Ios,Swift,Uikit,我有一个基于两个独立事件的奇怪动画问题: 1) 将UICollectionView反弹到顶部(如下面的视频所示) 2) 连续插入节(使用DifferenceKit) 我已经验证了这与自定义UICollectionFlowLayout中的属性计算无关 有人知道怎么解决吗 这是一个 UPD: 以下是一些更新集合的代码: private func updateCollection(){ let changeset=StagedChangeset(源:self.previousStage,目标:self

我有一个基于两个独立事件的奇怪动画问题:

1) 将UICollectionView反弹到顶部(如下面的视频所示)

2) 连续插入节(使用DifferenceKit)

我已经验证了这与自定义UICollectionFlowLayout中的属性计算无关

有人知道怎么解决吗

这是一个

UPD:

以下是一些更新集合的代码:

private func updateCollection(){
let changeset=StagedChangeset(源:self.previousStage,目标:self.viewModels)
//确保updateCollection从后台调用
DispatchQueue.main.sync{
self.delegate?.refreshCollection(使用:变更集,更新:{collection in
self.viewModels=集合
self.previousStage=收集
})
}
}

好吧,既然没有人提出解决方案,我可以提供两个我研究过的解决方案,以及它们的优缺点

之前 只有当collectionView.contentOffset.y为负值且节插入时,才会检测到问题

方法1 当我们滚动/保存任何集合时,我们的主线程RunLoop具有跟踪模式,如果iOS收到关于插入节的通知,则此操作将在公共模式下执行。它会立即更新,可能会忽略平滑度。解决办法是使用

RunLoop.current.perform(inModes:[.default]){/*performupdates*/}
主减号是一个转义块,因此异步更新。不太好

方法2 因为我不能在我的案例中使用异步更新,所以我只是这样做了

func scrollViewDidScroll(scrollView:UIScrollView){
guard let mode=RunLoop.current.currentMode,mode=.tracking,scrollView.contentOffset.y==0{
previousOffset=scrollView.contentOffset
返回
}
scrollView.setContentOffset(previousOffset,动画:false)
}

不要认为这是一个绝妙的解决方案,但我不知道如何用另一种方法解决它。

你能添加一些代码吗?我添加了@ShubhamOjha