shouldAutorotateToInterfaceOrientation не работает при первом запуске после новой установки приложения - PullRequest
0 голосов
/ 17 мая 2010

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

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

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

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

и внутри viewDidLoad и viewDidUnload У меня есть (соответственно):

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
и
 [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

Обновление 6 июля 2010 года:

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

Обновление 13 июля 2010 года:

Из Apple Руководство по программированию контроллера View :

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

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

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

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

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

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

0 голосов
/ 30 сентября 2011

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

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

if (![[UIDevice currentDevice] isGeneratingDeviceOrientationNotifications])
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
0 голосов
/ 16 ноября 2010

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

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

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

...