У меня есть ребенок UIViewController
с частью иерархии с UITabBarController
и UINavigationBarController
. Давайте назовем это ChildViewController
; тогда моя иерархия выглядит так:
UITabBarController
|
UINavigationViewController [tab 1]
|
SomeParentViewController
|
SomeOtherParentViewController
|
ChildViewController
Теперь я хочу, чтобы только ChildViewController
поддерживал поворот в альбомную ориентацию. (Это контроллер представления, который отображает вид в чате, и для некоторых проще использовать альбомный режим.) Я добавил метод - (BOOL) shouldAutorotateToInterfaceOrientation:
в ChildViewController
, чтобы объявить, что он поддерживает альбомную ориентацию, но поворот устройства не дал эффекта. После отладки я обнаружил, что – willAnimateRotationToInterfaceOrientation:duration:
не вызывается.
После некоторых поисков в Интернете я обнаружил, что потомок UITabBarController
поддерживает только данную ориентацию, если сам UITabBarController
поддерживает эту ориентацию. И, как ни странно, UITabBarController
поддерживает ориентацию, только если контроллеры представления для каждой из его вкладок поддерживают вращение. Как и на вкладке 1 выше, контроллеры представления для остальных трех вкладок являются UINavigationViewController
экземплярами; и поскольку мы должны идти глубже, каждый UINavigationViewController
поддерживает ориентацию, только если его дочерний контроллер представления поддерживает ориентацию.
Итак, добавление - (BOOL) shouldAutorotateToInterfaceOrientation:
к SomeParentViewController
и дочерние элементы других UINavigationController
экземпляров позволили ChildViewController
вращаться. Но теперь SomeParentViewController
и остальные три вкладки повернутся в ландшафт, и это выглядит ужасно. Я только хотел ChildViewController
для поддержки ландшафта.
В качестве защелки я создал собственный подкласс UITabBarController
с именем RotatingUITabBarController
и добавил глобальный флаг к классу ChildViewController
, который позволяет мне знать, был ли он создан и отображается. RotatingUITabBarController
переопределяет только - (BOOL) shouldAutorotateToInterfaceOrientation:
и реализуется как:
if ([ChildViewController isDisplayed]) {
return ((toInterfaceOrientation == UIInterfaceOrientationPortrait) ||
(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) ||
(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight));
}
return NO;
Теперь, если я загружаю приложение, переключение на SomeParentViewController
или любую другую вкладку и вращение телефона не переключается в альбомный режим, а остается в портретном режиме. Все идет нормально. Если я создаю и отображаю ChildViewController
и поворачиваю телефон, он входит в альбомную ориентацию. Все идет нормально. Но теперь, если я нажимаю ChildViewController
, чтобы показать SomeOtherParentViewController
, это также в ландшафте. Как и SomeParentViewController
, и все остальные вкладки, на которые я переключаюсь.
Я сейчас не в фокусе. Любой совет будет высоко ценится, спасибо!