2013-11-07 2 views
3

На стартовой странице моего приложения установлен на портрет только с этим немного коды:Предотвращение AlertView от автоматического вращающегося

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait ; 
} 

Когда приложение запускает UIAlertView появляется имя пользователя и пароль входа. Способ отображения: от viewWillAppear.

Это работало отлично для iOS6 но так iOS7, если переключить устройство на альбомную, основной вид остается в портретном, но тревога вид клавиатуры и повернуть на альбомную. Еще странно причуда, что, когда я переключаюсь обратно к портрету, только клавиатура переключается обратно (в урезанном виде), в результате чего предупреждения заморожен в ландшафтном режиме:

enter image description here

Может кто-нибудь сказать мне, как это предотвратить ?

-EDIT-

Код автоповорота называется в отдельную категорию:

@implementation UINavigationController (Orientation) 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [self.topViewController supportedInterfaceOrientations]; 
} 

-(BOOL)shouldAutorotate 
{ 
    if (UIInterfaceOrientationIsLandscape([[UIDevice currentDevice] orientation])) return NO; 
    else return YES; 
} 

@end

-Edit 2-

Я также попытался создать категорию на UIAlertView, но он никогда не был вызван:

@implementation UIAlertView (Orientation) 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

-(BOOL)shouldAutorotate 
{ 
    return NO; 
} 

-Edit 3-

Я не знаю, как отношение это, но вот код для отображения предупреждения:

- (void)alertWithMessage:(NSString *)theMessage 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Login" 
                message:theMessage 
                delegate:self 
              cancelButtonTitle:@"Login" 
              otherButtonTitles: nil]; 

    [alert setAlertViewStyle:UIAlertViewStyleLoginAndPasswordInput]; 
    UITextField *nameField = [alert textFieldAtIndex:0]; 
    [alert show]; 
} 
+1

Вы говорите «когда приложение запускается». Когда это точно? В каком методе вы называете 'alertWithMessage:'? –

+0

Он вызывается из 'viewWillAppear'. Я уточню вопрос. – Robert

+1

Попробуйте сделать это в 'viewDidAppear:'. Не уверен, что это будет иметь значение, но я уже видел эту странность. –

ответ

3

Попробуйте сделать это в viewDidAppear:. Я видел такое странное поведение, как раньше, потому что макеты представлений еще не определены. В viewDidAppear: все установлено и выложено, поэтому в этой точке не должно быть никаких проблем.

+0

Спасибо. Работал. – Robert

1

Вы попробуйте с реализацией shouldAutorotate? Вы можете сделать в вашем случае:

- (BOOL)shouldAutorotate 
{ 
    if (UIInterfaceOrientationIsLandscape([[UIDevice currentDevice] orientation])) return NO; 
    else return YES; 
} 
+0

Этот метод реализован в контроллере представления, управляющем UIAlertView? Является ли этот контроллер представлений контроллером корневого представления вашего приложения? – zbMax

+0

Да, у меня есть категория, которая переопределяет методы 'toAutorotate' в контроллере корневого представления, поэтому' toAutorotate' вызывается в категории, но все же не предотвращает ротацию. Я отредактирую свой вопрос, чтобы включить код категории. – Robert

1

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

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^(void) { 
    [self.updateAlert show]; 
}); 
Смежные вопросы