Подскажите, пожалуйста, «правильный» или «лучший» подход к работе с портретной и альбомной ориентацией интерфейса в iOS 8? Кажется, что все функции, которые я хочу использовать для этой цели, устарели в iOS 8, и мое исследование не показало четкой и элегантной альтернативы. Я действительно должен смотреть на ширину и высоту, чтобы определить для себя, в портретном или ландшафтном режиме?
Например, в моем контроллере представления, как мне реализовать следующий псевдокод?
if we are rotating from portrait to landscape then
do portrait things
else if we are rotating from landscape to portrait then
do landscape things
UIViewController
. См. Раздел «ОбработкаОтветы:
Apple рекомендует использовать классы размеров как грубую меру доступного пространства на экране, чтобы пользовательский интерфейс мог значительно изменить его макет и внешний вид. Учтите, что iPad в портретной ориентации имеет те же классы размеров, что и в альбомной ориентации (Обычная ширина, Обычная высота). Это означает, что ваш пользовательский интерфейс должен быть более или менее похожим для двух ориентаций.
Однако переход с книжной ориентации на альбомную в iPad достаточно значительный, и вам может потребоваться внести небольшие изменения в пользовательский интерфейс, даже если классы размеров не изменились. Поскольку методы, связанные с ориентацией интерфейса
UIViewController
, устарели, Apple теперь рекомендует реализовать следующий новый метод вUIViewController
качестве замены:Большой! Теперь вы получаете обратные вызовы прямо перед началом вращения и после его завершения. Но как насчет того, чтобы на самом деле знать, какой поворот - портретный или альбомный?
Apple рекомендует рассматривать вращение как простое изменение размера родительского представления. Другими словами, во время поворота iPad с книжной на альбомную вы можете думать об этом как о представлении корневого уровня, просто меняя его
bounds.size
с{768, 1024}
на{1024, 768}
. Зная это, вы должны использоватьsize
переданный вviewWillTransitionToSize:withTransitionCoordinator:
метод выше, чтобы выяснить, поворачиваетесь ли вы в портретную или альбомную ориентацию.Если вам нужен еще более простой способ переноса устаревшего кода на новый способ работы iOS 8, рассмотрите возможность использования этой простой категории в UIView, которая может использоваться для определения того, является ли представление «портретным» или «ландшафтным» на основе его размер.
Резюмируем:
viewWillTransitionToSize:withTransitionCoordinator:
обратный вызов в UIViewController.statusBarOrientation
свойство - которое в основном является свойством на уровне устройства - для определения того, следует ли размещать вид для «портретной» или «альбомной» ориентации. Ориентация строки состояния должна использоваться только кодом, имеющим дело с вещами, вроде тех,UIWindow
которые фактически находятся на самом корневом уровне приложения.источник
UIViewControllerTransitionCoordinator
- это кошмар :-(viewdidlayoutsubviews
тогда? Я думал,viewdidlayoutsubviews
он используется для фиксации связанных изменений из-за вращения. Вы можете подробнее рассказать об этом?Основываясь на очень подробном (и принятом) ответе smileyborg, вот адаптация с использованием swift 3:
А в
UICollectionViewDelegateFlowLayout
реализацииисточник
Я просто использую Центр уведомлений:
Добавьте переменную ориентации (объясню в конце)
Добавить уведомление при появлении представления
Удалить уведомление, когда просмотр исчезнет
Получает текущую ориентацию при срабатывании уведомления
Проверяет ориентацию (книжная / альбомная) и обрабатывает события
Причина, по которой я добавляю переменную ориентации, заключается в том, что при тестировании на физическом устройстве уведомление об ориентации вызывается при каждом незначительном движении устройства, а не только при его вращении. Добавление операторов var и if вызывает код, только если он переключился на противоположную ориентацию.
источник
super
изviewDidAppear
иviewWillDisappear
должны называтьсяС точки зрения пользовательского интерфейса я считаю, что использование классов размеров - это рекомендуемый Apple подход к работе с интерфейсами разной ориентации, размеров и масштабов.
См. Раздел « Черты, описывающие класс размера и масштаб интерфейса» здесь: https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html
Это тоже хорошая статья: https://carpeaqua.com/thinking-in-terms-of-ios-8-size-classes/
ИЗМЕНИТЬ Обновленную ссылку: https://carpeaqua.com/2014/06/14/thinking-in-terms-of-ios-8-size-classes/ (Источник: Koen)
источник