WillRotateToInterfaceOrientation не называется

Я возвращаю YES в моей функции контроллера shouldAutorotateToInterfaceOrientation, и я вижу, используя точки останова, возвращаемые YES, однако метод willRotateToInterfaceOrientation не вызывается, и ни один другой вращающийся способ. Кажется, что после возвращения YES ничего не происходит!

Любые идеи?

Mike

Ответы

Ответ 1

Является ли это view viewController подвид другого контроллера корневого представления, который не является контроллером навигации? если это так, то вызов не распространяется на контроллер subviews, поэтому возможно, что ваш просмотр не вращается.

Ответ 2

У меня есть аналогичная проблема, и я видел, как Даниэль ответил, но я не могу найти подтверждения в документации разработчика. Не то, чтобы я не верю в ответ, но я действительно не понимаю, почему вызов ориентации не распространяется.

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

[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(detectOrientation) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

Ответ 3

Одна вещь, которую нужно искать, я обнаружил, что если у меня был UIPopoverController, вызванный в [UINavigationController viewDidAppear], то willRotateToInterfaceOrientation и didRotateFromInterfaceOrientation не вызываются. Похоже, что UIPopoverController является модальным блоком, который вызывает метод вращения.

Ответ 4

Да, я тоже. Хорошо, он не будет вызван в sub-viewcontroller - должен его удалить. Можете справиться с этим. И идея уведомления работает хорошо, за исключением того, что вы только получаете "сделал...", а не "будет..." (afaik), и в любом случае это беспорядочное решение проблемы, которой не должно быть.

Моя ошибка заключалась в вызове [super loadView] в моем loadView. Не должно это делать. Когда я удалил [super loadView] и выделил начало представления willRotateToInterfaceOrientation.

Что действительно странно в том, что [super loadView] находился в контроллере sub-view, и событие даже не доходило до верхнего...

Ответ 5

Если вы не получаете обратные вызовы на willAutoRotateToInterfaceOrientation в любом контроллере просмотра, добавьте контроллер представления в качестве контроллера дочернего представления контроллера корневого представления.

Для Eg; скажем, self.viewController - ваш контроллер корневого представления, а childViewController - это контроллер представлений, в котором вы хотите получить обратные вызовы автоматического поворота, добавьте следующую строку кода;

[self.viewController addChildViewController:childViewController];

На самом деле, добавление в качестве контроллера детского представления к любому контроллеру вида, который получает обратные обратные вызовы, тоже будет работать.

Надеюсь, что это поможет.

Ответ 6

Документация Apple

Во время запуска приложения всегда должны устанавливать свой интерфейс в портретной ориентации. После того, как приложение: doneFinishLaunchingWithOptions: метод возвращается, приложение использует механизм вращения контроллера представления, описанный выше, для поворота представлений до соответствующей ориентации до отображения окна.

Итак, если вы используете TabBarViewController, будьте осторожны, чтобы настроить выбранное представление в методе application:didFinishLaunchingWithOptions:.