shouldAutorotateToInterfaceOrientation не работает при первом запуске после новой установки приложения

Когда приложение, над которым я работаю, устанавливается либо через Ad-Hoc через iTunes, либо создается непосредственно на устройстве, при первом запуске единственный контроллер представления в моем приложении, который реагирует на изменения ориентации, не получает вызовов shouldAutorotateToInterfaceOrientation: с переданным аргументом ландшафта; отладка показывает, что он вызывается только для портрета. Каждый последующий запуск ведет себя так, как я и ожидал, то есть есть вызовы shouldAutorotateToInterfaceOrientation:, сделанные как с аргументами альбомной, так и портретной ориентации. Это точное поведение можно увидеть в симуляторе iPhone, на iPhone и iPod touch.

Итак, мой вопрос: почему уведомления об ориентации при первом запуске приложения будут отличаться от уведомлений при каждом последующем запуске? Я ошибаюсь, полагая, что не могу контролировать изменения ориентации, кроме ответа на shouldAutorotateToInterfaceOrientation:?

Внутри рассматриваемого ViewController:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
 return YES;
}

and inside of viewDidLoad and viewDidUnload I've got (respectively):

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
and

 [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

Обновление от 6 июля 2010 г.

Все еще не удалось решить проблему. Я ненадолго забыл об этой проблеме и вернулся к ней, но все еще вижу проблему при совершенно других обстоятельствах. Кто-нибудь?

Обновление от 13 июля 2010 г.

От Apple См. Руководство по программированию контроллера:

"... объект окна выполняет большую часть работы, связанной с изменением текущей ориентации. [...] В частности, он работает с контроллером представления, корневое представление которого было недавно добавлено в окно или представлено в нем. В других случаях словами, объект окна работает только с самым передним контроллером представления, представление которого было отображено ... "

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

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


person jtrim    schedule 17.05.2010    source источник
comment
У меня были всевозможные проблемы с ориентацией пользовательского интерфейса, и я видел много отчетов о том, что это исправлено в разных версиях. С какими библиотеками вы связываетесь? Может быть, попробуйте более позднюю библиотеку и посмотрите, лучше ли это.   -  person Andiih    schedule 17.05.2010
comment
iPhone OS 3.0 и связывание с i996.photobucket.com/albums/ af85 / jtrim / Попробую увеличить цель сборки и посмотрю, как пойдет   -  person jtrim    schedule 18.05.2010
comment
Вам не нужно вызывать begin / endGeneratingDeviceOrientationNotifications в контроллере представления. shouldAutorotateToInterfaceOrientation будет вызываться без этого.   -  person progrmr    schedule 18.05.2010
comment
Да, я знал, что в этом нет необходимости, но я просто вставил его туда, чтобы посмотреть, что произошло, и подумал, что есть хороший шанс, что кто-то может предложить это для ответа типа «выстрел в темноте», поэтому я включил его здесь.   -  person jtrim    schedule 18.05.2010
comment
Я увеличил цель сборки и не увидел изменений.   -  person jtrim    schedule 18.05.2010


Ответы (3)


Так и не решил эту проблему - я ушел из компании, где столкнулся с ней, прежде чем у меня появилась возможность. Тем не менее, к тому времени, как я ушел, у меня было довольно хорошее преимущество. Я связался с Apple DTS по поводу этой проблемы, и они отметили, что для правильной работы автоповорота все контроллеры ViewController в стеке представлений, связанные с автоповоротом, должны вызывать суперметоды в реализациях методов (т.е. вызов [super viewDidLoad] из viewDidLoad ViewController). Я не помню, какие именно методы они цитировали, но, вероятно, стоит попробовать, чтобы убедиться, что вы правильно вызываете super там, где это необходимо.

[РЕДАКТИРОВАТЬ] Если кто-то может подтвердить это, я отмечу это как принятый ответ. Спасибо!

person jtrim    schedule 03.11.2010

также убедитесь, что вы установили:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return YES;}

в ВСЕ ViewControllers.m в вашем приложении, а не только в том, над которым вы работаете (если у вас их несколько). Я изо всех сил пытался заставить это работать для FirstViewController, но это не сработало, несмотря ни на что. Как только я добавил приведенный выше код ко всем четырем контроллерам представления, он начал работать нормально (на всех четырех).

person EarlGrey    schedule 16.11.2010
comment
Так что, если у вас есть контроллеры представления, которые не должны автоматически вращаться? Это, безусловно, верный сценарий. - person jtrim; 16.11.2010
comment
Думаю, тогда это не применимо. - person EarlGrey; 23.11.2010

У меня была аналогичная проблема - заголовок UIDevice.h перечисляет endGeneratingDeviceOrientationNotifications и beginGeneratingDeviceOrientationNotifications как «nestable». Оказывается, у меня были несбалансированные вызовы этих методов.

Я быстро решил эту проблему с помощью следующего изменения в beginGeneratingDeviceOrientationNotifications:

if (![[UIDevice currentDevice] isGeneratingDeviceOrientationNotifications])
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
person Ash Furrow    schedule 30.09.2011