7

在 ipad 上有 uiviewcontroller,配置如下:

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

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

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

但是如果我旋转我的 ipad 方法willRotateToInterfaceOrientation不会被调用,所以我无法调整界面。

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

4

3 回答 3

13

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

1)如果您的视图viewController是 a不是 asubView的其他视图,则旋转调用可能不会传播到子视图的控制器。rootViewControllernavigationController

2)我在某处读到,如果Super在需要的地方没有正确调用方法,那么它可能是旋转问题的原因,这意味着视图堆栈中与自动旋转相关的所有 ViewController 都必须调用super方法实现中的方法(即调用[super viewDidLoad]来自 ViewController 的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 
        }
     }
于 2013-01-05T10:02:50.433 回答
4

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

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

  • 您的视图控制器全屏显示另一个视图控制器的内容。
  • 用户旋转设备以改变用户界面方向。
  • 您的应用程序会关闭呈现的视图控制器。

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

这正是我的问题所在,所以我在 -(void)viewWillAppear:(BOOL)animated 中添加了一些逻辑,以调整我的布局,如果某些东西在正确的位置。

于 2013-01-05T09:56:18.003 回答
0

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

[rootViewController addChildViewController:viewController];
于 2014-08-14T12:02:38.507 回答