方向错误 - 陷入风景

时间:2015-04-29 01:07:52

标签: ios objective-c

我有一个iPhone应用程序,UIViewController作为第一个控制器。在其中,我已经获得了强制它成为风景的标准方法(见下文)。

我还得到了第二个视图,我在viewWillAppear中显示为一个模态 - 当我从网络中提取一些内容时,它意味着一个闪屏。

当我将设备物理旋转到横向模式并启动应用程序时,会出现问题。模态显示(纵向),但几秒后它被解除时,主视图以横向显示。

另一方面,如果我注释掉模态的代码并以横向方式启动应用程序,主视图将以纵向显示。

有关如何在横向启动应用程序时将主视图保持在纵向模式的任何建议吗?

- (void)viewWillAppear:(BOOL)animated {
   // Show the loading splash screen until the webview has completed
   [self performSegueWithIdentifier:@"sgImageModal" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
   if ([segue.identifier isEqualToString:@"sgImageModal"]) {     
       splashScreen.modalPresentationStyle = UIModalPresentationFullScreen;        
   }
}

- (BOOL)shouldAutorotate {
    return NO;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [self viewWillAppear:animated];
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

更新1

根据建议,我已经移动逻辑以将模态显示到viewDidAppear和viewDidLoad中。我也改变了shouldAutorotate以返回YES。没有产生预期的影响。

1 个答案:

答案 0 :(得分:0)

在当前视图控制器完成加载或完成转换之前,您无法呈现模态视图控制器。 90%的情况下,这意味着您必须在viewDidAppear:而不是viewWillAppear:中呈现模态视图控制器。问题是,当代码在viewWillAppear:中执行时,视图可能无法完成它的设置(包括确定哪个方向呈现在其中)。

Here是Jacob Knobel的一个方便答案,它解释了每个视图生命周期方法何时被调用。

因此,如果您希望立即显示启动画面,请将其显示为不带动画,并从viewDidAppear:显示。启动应用程序后,您的模态应立即显示。

修改 - 您是否尝试从YES返回shouldAutorotate?您已经指定了支持的界面方向,并告诉它如果方向是纵向的话它应该自动旋转,但是您已经告诉它它不应该自动旋转?