Как рассчитать размер iOS 11 в различной ориентации?

Я рассчитываю itemSize в зависимости от безопасной области для UICollectionView с горизонтальной прокруткой и пользовательским макетом.

образ

Но для iPhone X безопасная зона имеет разный размер для разной ориентации. У меня вопрос, как мне рассчитать размер безопасной области для альбомной ориентации в функции viewWillTransition? Или как можно обойтись без этого расчета?

1 ответ

Решение

РЕДАКТИРОВАТЬ

Чтобы получить безопасный размер области без создания дополнительных представлений, используйте это:

view.safeAreaLayoutGuide.layoutFrame.size

Если вы хотите использовать viewWillTransition метод вы можете использовать это:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    // Before rotation
    print(view.safeAreaLayoutGuide.layoutFrame.size)

    coordinator.animate(alongsideTransition: { (context) in
        // During rotation
    }) { (context) in
        // After rotation
        print(self.view.safeAreaLayoutGuide.layoutFrame.size)
    }
}

В блоке завершения вы получите желаемый размер, однако обратите внимание, что этот код будет вызываться после поворота.

Оригинальный ответ

Решение с использованием дополнительного UIView:

Что я сделал, чтобы создать UIView и прикрепите его с константой 0 к безопасным областям, чтобы он всегда соответствовал размеру безопасной области:

Я создал @IBOutlet того, что UIView И в viewDidLayoutSubviews() проверьте размер:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    print(containerView.frame.size)
}

После поворота я также получаю обновленный размер этого UIView.

Используйте collectionView UICollectionViewDelegateFlowLayout (_:layout:sizeForItemAt:). Работает как шарм. Установка размера в блоке завершения скоординированного объекта.animate(наряду с переходом: завершением:) в viewWillTransition(to:with:) у меня не сработала, потому что анимация размера происходит после окончания анимации ориентации, что выглядит странно.

Другие вопросы по тегам