iOS 8容器视图控制器子项旋转

时间:2015-01-05 11:19:48

标签: objective-c ios8 rotation

我有一个自定义容器UIViewController。 容器包含两个孩子UIViewControllers。 我需要禁用其中一个的旋转。

文档说明:

  

默认情况下,自动旋转和外观回调   转发给孩子们。

-(BOOL)shouldAutorotate从未被要求过孩子。

如何在 iOS 8 中禁用子视图控制器的旋转?

3 个答案:

答案 0 :(得分:3)

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

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

你可能想做的是反转“静态”视图,以便它保持与屏幕相关的固定方面。

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

– willRotateToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
<\ n>在ios8中,它们已被弃用并替换为

- viewWillTransitionToSize:withTransitionCoordinator:

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

如果这对您不起作用,则始终可以创建自定义视图并让它(或viewController)注册设备旋转通知。为此,您需要将beginGeneratingDeviceOrientationNotifications发送至[UIDevice currentDevice],然后在通知中心注册这些通知:

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

编辑

  

“框架怎么样?”

关于框架的内容是什么?这与此无关。您将对“非旋转”视图应用旋转变换。 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将返回相应的旋转变换,centerForOrientation将返回从原始未旋转视图的中心坐标派生的中心。

使用viewWillTransition可以在界面旋转到新设备方向之前控制旋转。此时UIDeviceOrientation将为您提供正确的目标方向,而UIInterfaceOrientation仍将返回预先旋转的方面。如果动画之间需要非常紧密的协调,可以使用UIViewControllerTransitionCoordinator对象。

答案 1 :(得分:1)

在视图控制器中

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

答案 2 :(得分:1)

我认为你不能。当应用程序查询viewController以获取支持的方向时,它只轮询其中一个,然后对整个窗口进行转换。我能建议的最好的是对相关viewController的容器视图进行仿射变换,以便反转/补偿旋转。