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