iOS 8 个容器视图控制器 children 旋转

iOS 8 Container View Controller children rotation

我有一个自定义容器 UIViewController。 该容器包含两个 children UIViewControllers。 我需要为其中之一禁用旋转。

文档状态:

By default, rotation and appearance callbacks are automatically forwarded to children.

但是-(BOOL)shouldAutorotate从来没有被征召过children。

如何在 iOS8 中禁用 child 视图控制器的旋转?

在视图控制器中

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

我认为你做不到。当应用程序查询 viewController 支持的方向时,它只轮询其中一个方向,然后对整个 window 进行转换。我能建议的最好的方法是对有问题的 viewController 的容器视图进行仿射变换,以便 reverse/compensate 旋转。

您的问题可以更详细地确定您要实现的目标。这是一个答案,但鉴于问题有点含糊,我可能做出了一些错误的假设。

您引用的方法 -shouldAutoRotate 仅适用于顶级 viewController 的视图。相对而言,子视图不会旋转。但他们可能会根据新布局自行调整。

您可能想要做的是反向旋转 'static' 视图,使其相对于屏幕保持固定的纵横比。

您引用的文档指的是这些方法(pre-ios8)

– willRotateToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:

在 ios8 中它们已被弃用并替换为

- viewWillTransitionToSize:withTransitionCoordinator:

如果您使用此方法,则必须检查 [UIDevice currentDevice] 的方向并进行反向旋转调整(这将是旋转变换)以适应。

如果这不适合您,始终可以制作自定义视图并让它(或 viewController)注册设备轮换通知。为此,您可以将 beginGeneratingDeviceOrientationNotifications 发送到 [UIDevice currentDevice],然后在通知中心注册这些通知:

  [[NSNotificationCenter defaultCenter] 
           addObserver:self 
              selector:@selector(deviceOrientationDidChange) 
                  name:UIDeviceOrientationDidChangeNotification object:nil];

编辑

"what about frame?"

什么关于框架?这与这里无关。您将对 'non-rotating' 视图应用旋转变换。 Apple 建议永远不要在应用转换后获取或设置框架 属性,因为数字不再有意义。您可以改为设置边界和中心属性,或者 - 可能更好 - 使用自动布局约束 或自动调整掩码 来获得结果。

edit2

这是一个使用 viewWillTransitionToSize 的(动画)示例:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {

     UIDeviceOrientation deviceOrientation = 
       [UIDevice currentDevice].orientation;
     CGAffineTransform transform = 
      [self transformForOrientation:deviceOrientation];
     CGPoint center = 
        [self centerForOrientation:deviceOrientation];
     [UIView animateWithDuration:0.2 animations:^{
        self.rotatingView.center = center;
        self.rotatingView.transform = transform;
}];   
}

其中 transformForOrientation 将 return 适当的旋转变换,而 centerForOrientation 将 return 从原始未旋转视图的中心坐标派生的中心。

使用 viewWillTransition 可以让您在界面旋转到新的设备方向之前 控制旋转 。此时 UIDeviceOrientation 将为您提供正确的目的地方向,而 UIInterfaceOrientation 仍将 return 旋转前的方位。如果你真的需要动画之间的紧密协调,你可以使用 UIViewControllerTransitionCoordinator 对象。