Как предотвратить вызов ячейки willDisplay: при перезагрузке данных UICollectionView? - PullRequest
0 голосов
/ 16 мая 2019

У меня есть анимация, вызываемая на клетку (чтобы быстро уклоняться и медленно расти). Анимация выполняется в willDisplay cell:. У меня проблема в том, что всякий раз, когда я перезагружаю данные после получения большего количества данных с сервера, будет отображаться ячейка willDisplay: для всех видимых ячеек. Это заставляет все видимые клетки сжиматься и расти. Есть ли способ вызвать данные перезагрузки только для вновь полученных элементов?

Текущий вызов анимации:

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 Ответ

1 голос
/ 16 мая 2019

Вы можете попробовать

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 после первой перезагрузки

...