Поддерживает ротацию только на дочернем UIViewController в иерархии? - PullRequest
0 голосов
/ 05 ноября 2011

У меня есть ребенок 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, и все остальные вкладки, на которые я переключаюсь.

Я сейчас не в фокусе. Любой совет будет высоко ценится, спасибо!

1 Ответ

1 голос
/ 05 ноября 2011

Возможно, лучшая модель для поведения, которое вам, по-видимому, нужно, - это приложение YouTube.В большинстве случаев интерфейс только для портрета, но представление для воспроизведения видео работает как в портретной, так и в альбомной ориентации.

Если вы посмотрите на это приложение, вы заметите, что вся часть интерфейса с вкладками в действительности является модальнойпросмотр контроллера.Когда вы запускаете приложение, контроллер панели вкладок сразу же представляется модально.Единственный раз, когда вы покидаете этот модальный контроллер панели вкладок, это когда вы проигрываете видео - вы заметите, что весь интерфейс с вкладками сдвигается вниз, чтобы показать вид видео.Когда видео заканчивается, контроллер панели вкладок снова представлен модально.

Это инверсия "нормального" подхода, когда вы используете контроллер модального представления только кратко, но он очень хорошо работает в приложении YouTube,Это может или не может работать хорошо для вас тоже.Важно, чтобы приложение было предсказуемым и плавным, а пользователь всегда чувствовал себя под контролем.

...