UICollectionView не отвечает до полной остановки прокрутки - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть стандарт, работающий uicollectionview, и моя проблема заключается в том, что при прокрутке по вертикали uicollectionview не реагирует на любое последующее касание (то есть, останавливает прокрутку) до тех пор, пока прокрутка не остановится полностью.

Мне удалось зафиксировать проблему до метода делегата willDisplayCell, где я анимирую каждую отображаемую ячейку с помощью пузырькового эффекта. Мне любопытно, есть ли что-то в этом, что я могу посоветовать, где я смогу сохранить анимацию при соответствующей реакции на прикосновения?

Когда я полностью закомментирую метод делегата, отклик на касание и прокрутка работают отлично.

Вот мой код в методе делегата willDisplayCell:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    cell.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
    DispatchQueue.main.async {
        let delay = 0.035
        UIView.animate(withDuration: 1, delay: delay, usingSpringWithDamping: 0.75, initialSpringVelocity: 0.8, options: .curveEaseOut, animations: {
            cell.transform = CGAffineTransform(scaleX: 1, y: 1)
            self.view.layoutIfNeeded()
        }, completion: nil)
    }
}

1 Ответ

1 голос
/ 16 февраля 2020

Поигрался с вашим кодом, и кажется, что проблема возникает из-за того, что вы анимируете саму ячейку, но если вместо этого вы анимируете содержимое ячейки, то представление коллекции реагирует при прокрутке и в то же время сохраняет анимация пузыря.

Например, поместите все содержимое ячейки в один вид контейнера внутри ячейки и анимируйте этот вид контейнера вместо анимации самой ячейки.

final class Cell: UICollectionViewCell {

    override init(frame: CGRect) {
        super.init(frame: frame)
        backgroundView = UIView()
        backgroundView?.backgroundColor = .green
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    guard let cell = cell as? Cell else { return }
    cell.backgroundView?.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
    DispatchQueue.main.async {
        let delay = 0.035
        UIView.animate(withDuration: 1, delay: delay, usingSpringWithDamping: 0.75, initialSpringVelocity: 0.8, options: .curveEaseOut, animations: {
            // you should reset the transform to CGAffineTransform.identity instead of CGAffineTransform(scaleX: 1, y: 1).
            cell.backgroundView?.transform = CGAffineTransform.identity
            // Not sure why you call layoutIfNeeded() here?, but without it the animation is much smoother.
            //self.view.layoutIfNeeded()
        }, completion: nil)
    }
}
...