防止AlertView自动旋转

我的应用程序的启动页面设置为肖像只有这一点点的代码:

- (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait ; } 

当应用程序启动时出现用户名和密码input的UIAlertView 。 显示它的方法从viewWillAppear调用。

这对iOS6工作正常,但自iOS7以来,如果我将设备切换到横向,主视图保持纵向,但警报视图和键盘旋转到横向。 另一个奇怪的怪癖是,当我切换回肖像时,只有键盘切换回来(以截短的forms),将警报冻结在横向模式下:

在这里输入图像说明

谁能告诉我如何防止这个?

-编辑-

自动替代码在另一个类别中被调用:

 @implementation UINavigationController (Orientation) -(NSUInteger)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; } -(BOOL)shouldAutorotate { if (UIInterfaceOrientationIsLandscape([[UIDevice currentDevice] orientation])) return NO; else return YES; } 

@结束

-EDIT 2-

我也尝试在UIAlertView上创build一个类别,但它从来没有被称为:

 @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]; } 

试着做这个viewDidAppear: 我之前看到过这种奇怪的行为,因为视图布局还没有完全定义。 viewDidAppear: ,所有事情都已经制定好了,所以在这一点上不应该有任何问题。

你尝试执行shouldAutorotate ? 你可以在你的情况下做:

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

我正在遇到这种情况,但警报显示从AppDelegate。 在阅读Scott Berrevoet关于视图布局尚未完全定义的答案之后,我在显示警告对话框之前添加了一个非常小的延迟,以便给所有的一切设置一些时间并解决问题。

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^(void) { [self.updateAlert show]; });