willRotateToInterfaceOrientation не вызывается - PullRequest
13 голосов
/ 04 октября 2009

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

Есть идеи?

Mike

Ответы [ 6 ]

19 голосов
/ 05 октября 2009

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

18 голосов
/ 01 марта 2011

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

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

[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(detectOrientation) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
4 голосов
/ 06 августа 2011

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

2 голосов
/ 25 сентября 2013

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

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

[self.viewController addChildViewController:childViewController];

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

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

2 голосов
/ 16 сентября 2011

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

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

Что действительно странно, так это то, что [super loadView] был в субконтроллере субконтроллера , а событие даже не достигло верхнего ...

0 голосов
/ 29 февраля 2012

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

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

Поэтому, если вы используете TabBarViewController, будьте осторожны при настройке выбранного представления в методе application:didFinishLaunchingWithOptions:.

...