如何在重新加载UICollectionView的数据时防止willDisplay cell:被调用?

时间:2019-05-16 20:48:21

标签: swift uicollectionview uicollectionviewcell

我在一个单元格上调用了一个动画(快速回避并缓慢增长)。动画正在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)
    }

}

如果任何人都可以在不使用标志的情况下执行此操作,请告诉我。旗帜使事情变得混乱,引发战争。

1 个答案:

答案 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