我在一个单元格上调用了一个动画(快速回避并缓慢增长)。动画正在willDisplay cell:
中完成。我的问题是,每当我从服务器获取更多信息后重新加载数据时,都会在所有可见的单元格上调用willDisplay cell:。这导致所有可见细胞缩小并生长。有没有一种方法可以仅在新获取的项目上调用重新加载数据?
当前对动画的调用是
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if collectionView.isDragging {
(cell as! AnimatedView).shrinkAndGrow(toScale: STANDARD_SHRINK_SCALE, withDuration: STANDARD_GROW_DURATION)
}
}
我当前的解决方法是
extension UICollectionView {
func reloadData(completion: @escaping () -> ()) {
UIView.animate(withDuration: 0, animations: { self.reloadData()})
{_ in completion() }
}
}
在获取方法中
DispatchQueue.main.async { [weak self] in
self?.orders.append(contentsOf: orders)
self?.shouldAnimate = false
self?.collectionView.reloadData { [weak self] in
self?.shouldAnimate = true
}
}
我的处理方式
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if shouldAnimate, collectionView.isDragging {
(cell as! AnimatedView).shrinkAndGrow(toScale: STANDARD_SHRINK_SCALE, withDuration: STANDARD_GROW_DURATION)
}
}
如果任何人都可以在不使用标志的情况下执行此操作,请告诉我。旗帜使事情变得混乱,引发战争。
答案 0 :(得分:1)
您可以尝试
var shouldAnimate = false
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if shouldAnimate {
(cell as! AnimatedView).shrinkAndGrow(toScale: STANDARD_SHRINK_SCALE, withDuration: STANDARD_GROW_DURATION)
}
}
在第一次重新加载后更改shouldAnimate