Проблема с анимацией при одновременном подпрыгивании UIVCollectionView и перезагрузке раздела - PullRequest
0 голосов
/ 01 ноября 2019

У меня странная проблема с анимацией, основанная на двух независимых событиях:

1) Отскок UICollectionView к вершине (как на видео ниже)

2) Последовательная вставка разделов (с использованием DifferenceKit)

Я уже убедился, что это не имеет ничего общего с вычислением атрибутов в моем пользовательском UICollectionFlowLayout.

Кто-нибудь знает, как его решить?

Вот это Видео выпуска

UPD:

Вот код, обновляющий коллекцию:

private func updateCollection() {
        let changeset = StagedChangeset(source: self.previousStage, target: self.viewModels)
        // Guarantee that updateCollection calls from background 
        DispatchQueue.main.sync {
            self.delegate?.refreshCollection(with: changeset, update: { collection in
                self.viewModels = collection
                self.previousStage = collection
            })
        }
    }

1 Ответ

0 голосов
/ 07 ноября 2019

Ну, так как никто не предложил решение, я могу предложить два решения, которые я исследовал, с их плюсами и минусами

До ...

Проблема обнаруживается только тогда, когда collectionView.contentOffset.y отрицательно и вставка раздела.

Подход 1

Пока мы прокручиваем / удерживаем любую коллекцию, наш основной поток RunLoop имеет tracking и если iOS получает уведомление о вставке раздела, эта операция выполняется в режиме common . Он обновляется сразу, возможно, пренебрегая плавностью. Решение состоит в том, чтобы использовать

 RunLoop.current.perform(inModes: [.default]) { /* Perform updates */ } 

Главный минус - это экранирующий блок и, следовательно, асинхронные обновления . Не очень хорошо.

Подход 2

Поскольку я не могу использовать асинхронные обновления в моем случае, я только что сделал это

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard let mode = RunLoop.current.currentMode, mode == .tracking, scrollView.contentOffset.y == 0 else {
            previousOffset = scrollView.contentOffset
            return
        }
        scrollView.setContentOffset(previousOffset, animated: false)
    }

Не думаю, что это блестящее решение, ноПонятия не имею, как по-другому это исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...