UICollectionView layout - изменение ориентации устройства после перехода на другой контроллер представления - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть 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()
}
...