在iOS8的单个子视图上禁用自动旋转

我正在写一个绘图应用程序,我不想绘图视图旋转。 同时,我希望其他控件根据设备的方向很好地旋转。 在iOS 7中,我已经解决了这个问题:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { float rotation; if (toInterfaceOrientation==UIInterfaceOrientationPortrait) { rotation = 0; } else if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) { rotation = M_PI/2; } else if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) { rotation = -M_PI/2; } self.drawingView.transform = CGAffineTransformMakeRotation(rotation); self.drawingView.frame = self.view.frame; } 

但在iOS 8上,即使函数被调用并且转换设置正确,也不会阻止视图旋转。

我已经尝试创build一个视图控制器,它只是防止它的视图的旋转,并将其视图添加到视图层次结构,但它不响应用户input。

有任何想法吗?

谢谢!

好吧,在与子视图和transitionCoordinators的一些争斗后,我终于明白了:

 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { CGAffineTransform targetRotation = [coordinator targetTransform]; CGAffineTransform inverseRotation = CGAffineTransformInvert(targetRotation); [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { self.drawingView.transform = CGAffineTransformConcat(self.drawingView.transform, inverseRotation); self.drawingView.frame = self.view.bounds; } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; } 

我所做的是计算应用于视图的变换的逆,然后用它来改变变换。 此外,我改变了与视图范围的框架。 这是由于它是全屏。

迪米特里的回答对我来说是完美的。 这是代码的快速版本,以防有人需要…

 override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { let targetRotation = coordinator.targetTransform() let inverseRotation = CGAffineTransformInvert(targetRotation) coordinator.animateAlongsideTransition({ context in self.drawingView.transform = CGAffineTransformConcat(self.drawingView.transform, inverseRotation) self.drawingView.frame = self.view.bounds context.viewControllerForKey(UITransitionContextFromViewControllerKey) }, completion: nil) } 

在iOS 8转换不适用于视图控制器拥有的个别视图。 相反,旋转变换应用于UIWindow 。 结果是开发人员从来没有看到应用旋转,而是resize。

在iOS 8中,您可以覆盖大小类更改的callback并在其中执行自己的转换,也可以按照以下说明获取定向事件: https : //developer.apple.com/library/prerelease/ios/documentation/EventHandling /Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html 。