У меня есть UICollectionView
с horizontal scrolling
и paging
. Ячейки должны всегда иметь размер экрана, поэтому при изменении ориентации устройства происходит вызов collectionView.collectionViewLayout.invalidateLayout()
, а item size
и collection view offset
пересчитываются, и это работает хорошо.
Проблема возникает при переходе к другому контроллеру представления, затем повороте и возвращении к контроллеру представления с представлением коллекции. Тогда выглядит так, будто представление коллекции не учитывает изменение ориентации или что-то в этом роде и может быть видно две ячейки, что не должно происходить. Также есть некоторая странная анимация при возвращении к контроллеру представления с представлением коллекции. Как они должны быть исправлены?
Вот код:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
collectionView.collectionViewLayout.invalidateLayout()
coordinator.animate(alongsideTransition: { (context) in
}) { (context) in
}
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return collectionView.frame.size
}
func collectionView(_ collectionView: UICollectionView, targetContentOffsetForProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
let width = collectionView.frame.size.width
let visibleCells = collectionView.visibleCells
if visibleCells.count == 0 {
return CGPoint.zero
}
let cell = visibleCells[0]
let indexPath = collectionView.indexPath(for: cell)
let index = indexPath?.item
let offsetX = CGFloat(index!) * width
let offsetY: CGFloat = 0
let offset = CGPoint(x: offsetX, y: offsetY)
return offset
}
Пытаясь решить проблему, я делаю следующие звонки в viewDidAppear
, но безуспешно:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
collectionView.collectionViewLayout.invalidateLayout()
collectionView.layoutSubviews()
}