willRotateToInterfaceOrientation未从呈现的viewcontroller中调用

时间:2013-01-05 09:25:41

标签: ipad uiviewcontroller presentmodalviewcontroller screen-rotation

我在ipad上有 uiviewcontroller 这个配置:

shouldAutorotate (true) supportedInterfaceOrientations (UIInterfaceOrientationMaskAll)willRotateToInterfaceOrientation内部我执行一些技巧来调整我的界面。

从这个控制器的一个孩子,我展示了一个带有这个-poor-代码的QuickLookController。

[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:previewController animated:YES completion:nil];

但是如果我旋转我的ipad,方法willRotateToInterfaceOrientation没有被调用,那么我就无法调整界面。

有人可以解释我或给我一些建议吗?感谢

3 个答案:

答案 0 :(得分:13)

原因: 这个问题可能有很多种可能性。

1)如果您的观看次数viewController是其他subView的{​​{1}}而非rootViewController,那么轮播调用可能无法传播到navigationController subView的控制器。

2)在某处我读到如果Super方法在需要的地方没有被正确调用那么它可能是旋转问题的原因,这意味着视图堆栈中与自动旋转相关的所有ViewControllers都必须调用方法实现中的super方法(即从ViewController的[super viewDidLoad]调用viewDidLoad)。

您可以使用以下技巧来处理方向更改。

在viewWillAppear中注册通知程序。

-(void)viewWillAppear:(BOOL)animated{
[[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector(orientationChanged:)  name:UIDeviceOrientationDidChangeNotification  object:nil];}

方向更改将通知以下功能。

- (void)orientationChanged:(NSNotification *)notification{
[self handleOrientation:[[UIApplication sharedApplication] statusBarOrientation]];}

将调用以下方法来处理方向更改。

   - (void) handleOrientation:(UIInterfaceOrientation) orientation {

        if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) 
        { 
            //handle the portrait view    
        }
        else if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) 
        {
            //handle the landscape view 
        }
     }

答案 1 :(得分:4)

我在苹果文档中找到了一个段落:

  

如果在发生旋转时视图控制器的内容不在屏幕上,则它不会看到旋转消息列表。例如,请考虑以下事件序列:

     
      
  • 您的视图控制器全屏显示另一个视图控制器的内容。
  •   
  • 用户旋转设备,以便更改用户界面方向。
  •   
  • 您的应用程序会解除显示的视图控制器。
  •   
     

在此示例中,当旋转发生时,呈现视图控制器不可见,因此它不会接收任何旋转事件。相反,当它再次出现时,其视图只需调整大小并使用普通视图布局过程定位。如果您的布局代码需要知道设备的当前方向,它可以读取应用程序对象的statusBarOrientation属性以确定当前方向。

确切地说出我的问题是什么,所以我在里面加了一些逻辑      - (无效)viewWillAppear中:(BOOL)动画 如果有什么东西在正确的地方,调整我的布局。

答案 2 :(得分:0)

确保将视图控制器添加为根视图控制器的子视图,然后传递消息。

[rootViewController addChildViewController:viewController];