Apple рекомендует использовать классы размеров как грубую меру доступного пространства на экране, чтобы пользовательский интерфейс мог значительно изменить его макет и внешний вид. Учтите, что iPad в портретной ориентации имеет те же классы размеров, что и в альбомной ориентации (Обычная ширина, Обычная высота). Это означает, что ваш пользовательский интерфейс должен быть более или менее похожим для двух ориентаций.
Однако переход с книжной ориентации на альбомную в iPad достаточно значительный, и вам может потребоваться внести небольшие изменения в пользовательский интерфейс, даже если классы размеров не изменились. Поскольку методы, связанные с ориентацией интерфейса UIViewController
, устарели, Apple теперь рекомендует реализовать следующий новый метод в UIViewController
качестве замены:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// Code here will execute before the rotation begins.
// Equivalent to placing it in the deprecated method -[willRotateToInterfaceOrientation:duration:]
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// Place code here to perform animations during the rotation.
// You can pass nil or leave this block empty if not necessary.
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// Code here will execute after the rotation has finished.
// Equivalent to placing it in the deprecated method -[didRotateFromInterfaceOrientation:]
}];
}
Большой! Теперь вы получаете обратные вызовы прямо перед началом вращения и после его завершения. Но как насчет того, чтобы на самом деле знать, какой поворот - портретный или альбомный?
Apple рекомендует рассматривать вращение как простое изменение размера родительского представления. Другими словами, во время поворота iPad с книжной на альбомную вы можете думать об этом как о представлении корневого уровня, просто меняя его bounds.size
с {768, 1024}
на {1024, 768}
. Зная это, вы должны использовать size
переданный в viewWillTransitionToSize:withTransitionCoordinator:
метод выше, чтобы выяснить, поворачиваетесь ли вы в портретную или альбомную ориентацию.
Если вам нужен еще более простой способ переноса устаревшего кода на новый способ работы iOS 8, рассмотрите возможность использования этой простой категории в UIView, которая может использоваться для определения того, является ли представление «портретным» или «ландшафтным» на основе его размер.
Резюмируем:
- Вы должны использовать классы размеров, чтобы определить, когда показывать принципиально разные пользовательские интерфейсы (например, пользовательский интерфейс, похожий на iPhone, а не на интерфейс iPad).
- Если вам нужно внести меньшие корректировки в свой пользовательский интерфейс, когда классы размеров не меняются, а размер вашего контейнера (родительского представления) изменяется, например, когда iPad вращается, используйте
viewWillTransitionToSize:withTransitionCoordinator:
обратный вызов в UIViewController.
- Каждое представление в вашем приложении должно принимать решения о макете только на основе пространства, в котором оно было отведено для макета. Позвольте естественной иерархии представлений каскадировать эту информацию.
- Точно так же не используйте
statusBarOrientation
свойство - которое в основном является свойством на уровне устройства - для определения того, следует ли размещать вид для «портретной» или «альбомной» ориентации. Ориентация строки состояния должна использоваться только кодом, имеющим дело с вещами, вроде тех, UIWindow
которые фактически находятся на самом корневом уровне приложения.
UIViewController
. См. Раздел «Обработка