Ну, так как никто не предложил решение, я могу предложить два решения, которые я исследовал, с их плюсами и минусами
До ...
Проблема обнаруживается только тогда, когда 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)
}
Не думаю, что это блестящее решение, ноПонятия не имею, как по-другому это исправить.