防止AlertView自动旋转

时间:2013-11-07 10:10:57

标签: ios uialertview autorotate device-orientation

我的应用的启动页面只使用这一小段代码设置为 portrait

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait ;
}

当应用启动时,会显示UIAlertView用于输入用户名和密码。 显示它的方法是从viewWillAppear调用的。

这适用于 iOS6 ,但由于 iOS7 ,如果我将设备切换为横向,主视图仍保留为纵向,但警报视图和键盘旋转为横向。 另一个奇怪的怪癖是,当我切换回肖像时,只有键盘切换回来(以截断的形式),使警报以横向模式冻结:

enter image description here

谁能告诉我如何防止这种情况?

- 编辑 -

自动旋转代码在单独的类别中调用:

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

3 个答案:

答案 0 :(得分:3)

尝试在viewDidAppear:中执行此操作。我之前看到过这种奇怪的行为,因为视图布局尚未完全定义。在viewDidAppear:中,所有内容都已设置和布局,因此此时不应出现任何问题。

答案 1 :(得分:1)

您是否尝试过实施shouldAutorotate?你可以做你的情况:

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

答案 2 :(得分:1)

我遇到了这个问题,但是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];
});