it-roy-ru.com

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

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

image

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

15
bogmila

ПРАВКА

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

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 к безопасным областям, чтобы он всегда соответствовал размеру безопасной области:

 enter image description here

Я создал @IBOutlet этого UIView и в viewDidLayoutSubviews() проверил размер:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    print(containerView.frame.size)
}

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

11
jonaszmclaren

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

0
GK100