Почему мой UIViewController не будет вращаться с устройством?
Q: Почему не будет мой UIViewController вращаться с устройством?
A: UIViewController класс обеспечивает фундаментальную модель управления представления для приложений для iOS. Это предоставляет автоматическую поддержку для вращения представлений контроллера представления в ответ на изменения в ориентации устройства. Если свойства автоизменения размеров Вашего представления и подпредставлений должным образом сконфигурированы, это поведение автоматическое в большинстве случаев. Вот довольно исчерпывающий список причин, которые может не повернуть контроллер представления.
Вы добавили свой контроллер представления
UIViewсвойство кUIWindowкак подпредставление.Разработчики отговорены добавить свойство представления любого контроллера представления как подпредставление
UIWindow. Корневой контроллер представления Вашего приложения должен быть присвоен окну приложенияrootViewControllerсвойство или в Интерфейсном Разработчике, или во время выполнения прежде, чем возвратиться изapplication:didFinishLaunchingWithOptions:. Если необходимо вывести на экран содержание больше чем от одного контроллера представления одновременно, необходимо определить собственный контейнерный контроллер представления и использовать его в качестве корневого контроллера представления. Посмотрите Создающие Пользовательские Контейнерные Контроллеры Представления.При начале с iOS 6, если корневой контроллер представления не был присвоен окну приложения, поддерживаемые ориентации определяются только
UIApplicationобъект. Далее, контроллеры представления не будут уведомлены относительно изменений ориентации, которые могут привести к неожиданному поведению.Контроллер представления не поддерживает новую ориентацию.
Начинаясь с iOS 6, контроллер представления может ограничить свои поддерживаемые ориентации путем переопределения этого метода:
- (NSUInteger)supportedInterfaceOrientationsРеализация по умолчанию
supportedInterfaceOrientationsвозвращает маску вращения рекомендуемых значений ориентации для идиомы текущего устройства. Т.е.UIInterfaceOrientationMaskAllвозвращается на устройствах iPad иUIInterfaceOrientationMaskAllButUpsideDownвозвращается на устройствах iPhone. Существует мало потребности переопределить этот метод, если содержание, которым управляет контроллер представления, не должно только быть выведено на экран в подмножестве этих ориентаций. При переопределении этого метода реализация должна возвратить поразрядную комбинациюUIInterfaceOrientationMaskзначения.На iOS 5 и ниже, контроллер представления может поддерживать многократные ориентации путем переопределения этого метода:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientationДаже если
shouldAutorotateToInterfaceOrientationреализован, необходимо удостовериться, что это возвращаетсяYESдля всех ориентаций Вы хотите поддерживать. Возвраты реализации по умолчаниюYESеслиinterfaceOrientationравноUIInterfaceOrientationPortrait, блокировка контроллера представления в портретную ориентацию. Для поддержки всех ориентаций просто всегда возвращайтесьYES.Приложение не поддерживает те же ориентации как контроллер представления.
Начинаясь с iOS 6, UIKit использует обоих
UIApplicationвозразите и самый верхний контроллер представления для определения поддерживаемых ориентаций.UISupportedInterfaceOrientationsвведите приложениеInfo.plistдолжен содержать значение для каждой ориентации Ваши поддержки приложений. Система использует эти значения для получения поддерживаемой маски ориентации приложения. Делегат приложения может реализоватьapplication:supportedInterfaceOrientationsForWindow:возвратить aUIInterfaceOrientationMaskэто используется вместо значений из приложенияInfo.plist.На iOS 5 и ниже, значения для
UISupportedInterfaceOrientationsвведите приложениеInfo.plistтолько служите подсказкой к Трамплину, что он должен изменить местоположение строки состояния прежде, чем запустить Ваше приложение. Они не ограничивают поддерживаемые ориентации Вашего приложения после того, как оно было запущено.Контроллер представления отказался вращаться.
Начинаясь с iOS 6, когда UIKit решает, что вращение, возможно, должно произойти, оно вызывает
shouldAutorotateметод самого верхнего контроллера представления, чтобы определить, продолжить ли с вращением. Реализация по умолчанию этого метода возвратыYES; однако, контроллер представления может динамично отключить автоматическое вращение во время выполнения путем переопределенияshouldAutorotateвозвратитьсяNO.Контроллер представления является дочерним элементом другого контроллера представления.
Начало с iOS 6, только самый верхний контроллер представления (рядом
UIApplicationобъект), участвует в решении, вращаться ли в ответ на изменение ориентации устройства. Как правило, контроллер представления, выводящий на экран Ваше содержание, является дочерним элементомUINavigationController,UITabBarController, или пользовательский контейнерный контроллер представления. Можно должными быть для разделения на подклассы контейнерного контроллера представления для изменения значений, возвращенныхsupportedInterfaceOrientationsиshouldAutorotateметоды.Переопределения контроллера представления
initилиinitWithNibName:bundle:но не вызывает реализацию суперкласса. Для объекта, который будет инициализирован должным образом, необходимо вызвать супер на любомinitилиinitWithNibNameметод Вы являетесь переопределяющими в своих контроллерах представления.Все дочерние контроллеры представления в Вашем
UITabBarControllerилиUINavigationControllerне соглашайтесь с общим набором ориентации.На iOS 5 и ниже, чтобы удостовериться, что все Ваши дочерние контроллеры представления вращаются правильно, необходимо реализовать
shouldAutorotateToInterfaceOrientationдля каждого контроллера представления, представляющего каждую вкладку или уровень навигации. Каждый должен согласиться с той же ориентацией для этого, вращаются для появления. Т.е. они все должны возвратитьсяYESдля тех же позиций ориентации.Контроллер представления изменяет расположение своих подпредставлений программно.
Определенные разметки невозможны понять одни только маски автоизменения размеров использования. Контроллер представления может вручную расположение его подпредставления путем изменения их кадра, границ, или центрировать свойства. Разработчики не должны помещать код расположения ни в один из методов вращения, переопределенных контроллером представления (например.
shouldAutorotateToInterfaceOrientation). Существуют случаи, где интерфейс может вращаться без этих вызываемых методов, оставляя подпредставления контроллера представления в противоречивом состоянии.Если приложение только поддерживает iOS 5 или позже, необходимо поместить код расположения в контроллер представления
viewWillLayoutSubviews:илиviewDidLayoutSubviews:методы.Если приложение должно поддерживать iOS 4, необходимо поместить код расположения в
layoutSubviewsметод представления контроллера представления.
История версии документа
| Дата | Примечания |
|---|---|
| 18.04.2013 | Обновленный для включения изменений в авторотации в iOS 6. |
| 06.07.2010 | Добавленный случай не вызова супер на - (ID) init. |
| 08.04.2010 | Новый документ, описывающий ситуации, которые могут препятствовать тому, чтобы вращались контроллеры представления. |