2010-01-22 7 views
5

Я заметил, что я получаю очень прерывистую ориентацию на своем устройстве & симулятор.Очень прерывистая ориентация на устройстве и симуляторе

У меня есть modal view controller, который я представляю, и это единственное, что есть в моем приложении, которое поддерживает вращение.

Если я запускаю приложение на портрете, не двигая устройство, откройте модный VC и затем поверните устройство, оно обычно работает. Однако иногда, если я открываю приложение, удерживающее устройство в ландшафте, затем поворачиваюсь к портрету, запускаю VC, а затем поворачиваем устройство, при этом не происходит поворота. Это кажется очень прерывистым. Иногда, если я запускаю приложение в портретном режиме, а затем открываю VC и поворачиваю устройство, ничего не происходит, и пока я не уйду и не перезапущу его, в приложении не будет никакой ориентации.

Странно, потому что 50% времени это работает! Всякий раз, когда я запускаю его через Xcode и устанавливаю точки останова в shouldAutorotateToInterfaceOrientation, он всегда работает!

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

+0

Нет конкретной идеи, что не так, но я подумал, что я спрашиваю, что я всегда задаю себе, когда что-то странное происходит в пользовательском интерфейсе: «Вы вызываете что-нибудь в UIKit вне основного потока?» – lawrence

+0

Спасибо за комментарий. Нет, я уверен, что я этого не делаю! Все это очень озадачивает. –

+0

Случается ли это только в вашем приложении, или вы видите, что это плохо работает в других приложениях? – Jasarien

ответ

-1

Даже если вы попытаетесь запустить приложение в ландшафте, ваш телефон запустит его на портрете, а затем перейдет в альбом, в зависимости от положения вашего телефона.

Я не знаю, какой код вы используете для этого. Ниже приведен пример, взятый из фрагментов кода Apple. Посмотрите, поможет ли это.

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) 
interfaceOrientation duration:(NSTimeInterval)duration {  
    if (interfaceOrientation == UIInterfaceOrientationPortrait) 
    { 
     self.view = self.portrait; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
    { 
     self.view = self.landscape; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    { 
     self.view = self.portrait; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    { 
     self.view = self.landscape; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = 
     CGAffineTransformMakeRotation(degreesToRadian(90)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 
    } 
} 
+0

Спасибо за ответ. Кажется, это код для обмена между двумя отдельными портретными и пейзажными видами. Я просто разрешаю вращение одного вида, просто возвращая YES в методе shouldAutorotateToInterfaceOrientation. –

0

У меня были подобные вызовы, получая авторотации для правильной работы контроллеров зрения, чьи материнских зрений контроллеров не авторотация, хотя большинство из моего опыта было связанно с пререканиями UINavigationController в отличии от модальных контроллеров представления. Тем не менее, я рекомендую попробовать следующее:

  1. вызова presentModalViewController: на контроллере вид сверху уровень в иерархии, а не глубже ViewController.

  2. Если это не решает, попробуйте подклассов свой верхний контроллер представления уровня, и опрокинув его shouldAutorotateToInterfaceOrientation: искать что-то вроде этого:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    if (self.modalViewController) { 
     return [self.modalViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
    } 
    return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
} 
1

Так как вы упомянули «прерывистый», я бы сказал, что это имеет какое-то отношение к тому, что вы делаете после поворота.

Чтобы найти ошибку, я предлагаю удалить любой код после того, как произойдет ротация. Прокомментируйте любые сетевые действия или операции OpenGL. Также может помочь закрыть XCode и снова открыть его.

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

+0

Да, я определенно думаю, что происходит что-то странное. Я планирую удалить код до тех пор, пока он не будет работать и не рассекает его таким образом. Спасибо за предложение. –

0

ли вызов

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

, когда вы показываете ротацию-Aware вида помощи? (и, возможно, выключить его снова, когда вы его уволите?)

Другая вещь, которую я бы искал, - это подозрительные звонки на [UIWindow makeKeyWindow] или [UIResponder becomeFirstResponder].

Я также подписался на мероприятия UIDeviceOrientationDidChangeNotification и убедитесь, что в режиме Модального вызова вы получили сообщение [UIViewController shouldAutorotateToInterfaceOrientation:] для каждого получаемого вами события.

+0

Спасибо за помощь. Я попробую предложения и вернусь к вам! –

0

Я наконец выяснил, в чем проблема!

Оказалось, что только первое UIView, которое вы добавите в ваш UIWindow, будет задаваться вопросом, нужно ли вращаться. Любые последующие представления не получают это сообщение. Мое приложение использовало другое представление для анимации вдали от Default.png, который отображается при запуске, и это было сначала добавлено в окно!

Смежные вопросы