防止 AlertView 自动旋转

Posted

技术标签:

【中文标题】防止 AlertView 自动旋转【英文标题】:Prevent AlertView from auto rotating 【发布时间】:2013-11-07 10:10:56 【问题描述】:

我的应用程序的启动页面设置为 portrait 仅使用以下代码:

- (NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskPortrait ;

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

这在 ios6 上工作得很好,但是从 iOS7 开始,如果我将设备切换到横向,主视图仍然是纵向的,但警报视图和键盘会旋转到横向. 另一个奇怪的怪癖是,当我切换回纵向时,只有键盘切换回来(以截断形式),使警报在横向模式下冻结:

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

-编辑-

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

@implementation UINavigationController (Orientation)

-(NSUInteger)supportedInterfaceOrientations

    return [self.topViewController supportedInterfaceOrientations];


-(BOOL)shouldAutorotate

    if (UIInterfaceOrientationIsLandscape([[UIDevice currentDevice] orientation])) return NO;
    else return YES;

@结束

-编辑 2-

我也尝试在 UIAlertView 上创建一个类别,但它从未被调用:

@implementation UIAlertView (Orientation)

-(NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskPortrait;


-(BOOL)shouldAutorotate

    return NO;

-编辑 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];

【问题讨论】:

您说“应用程序启动时”。究竟是什么时候?你用什么方法调用alertWithMessage: 它是从viewWillAppear 调用的。我会更新问题。 尝试在viewDidAppear: 中进行操作。不确定这是否会有所作为,但我以前见过这样的怪事。 谢谢!曾在viewDidLoad 中尝试过,并误读了您的评论,认为这就是您的意思。刚刚在viewDidAppear 中尝试过,它成功了。为您的 cmets +1,如果您将它们作为答案发布,我会接受。 【参考方案1】:

尝试在viewDidAppear: 中执行此操作。我以前见过这样的奇怪行为,因为视图布局还没有完全定义。在viewDidAppear: 中,所有内容都已设置和布局,因此此时应该没有任何问题。

【讨论】:

谢谢。辛苦了。【参考方案2】:

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

- (BOOL)shouldAutorotate

    if (UIInterfaceOrientationIsLandscape([[UIDevice currentDevice] orientation])) return NO;
    else return YES;

【讨论】:

这个方法是在管理 UIAlertView 的视图控制器中实现的吗?这个视图控制器是你应用的根视图控制器吗? 是的,我有一个类别,它覆盖了根视图控制器中的shouldAutorotate 方法,因此在类别中调用了shouldAutorotate,但仍然不会阻止旋转。我将编辑我的问题以包含类别代码。【参考方案3】:

我遇到了这种情况,但 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];
);

【讨论】:

以上是关于防止 AlertView 自动旋转的主要内容,如果未能解决你的问题,请参考以下文章

如何像 iPhone 照片应用程序那样防止自动旋转?

防止一个视图控制器自动旋转?

防止多个UIAlertView重叠弹出

同一个视图中的多个 UIAlertViews

iOS UI 自动化:处理两个 alertView,其中一个触发另一个

如果自动布局打开,防止 UIScrollView 水平滚动