“interfaceOrientation”在iOS 8中被弃用,如何改变这个方法Objective C

我从Cocoa Controls下载了一个使用这个方法的simpleCamera视图

- (AVCaptureVideoOrientation)orientationForConnection { AVCaptureVideoOrientation videoOrientation = AVCaptureVideoOrientationPortrait; switch (self.interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: videoOrientation = AVCaptureVideoOrientationLandscapeLeft; break; case UIInterfaceOrientationLandscapeRight: videoOrientation = AVCaptureVideoOrientationLandscapeRight; break; case UIInterfaceOrientationPortraitUpsideDown: videoOrientation = AVCaptureVideoOrientationPortraitUpsideDown; break; default: videoOrientation = AVCaptureVideoOrientationPortrait; break; } return videoOrientation; } 

问题是“interfaceOrientation”在iOS 8弃用,但我不知道什么,以及如何在开关条件中取代这一点。

获取设备方向不正确。 例如,设备可能处于横向模式,但仅支持纵向的视图控制器将保持纵向。

相反,使用这个:

 [[UIApplication sharedApplication] statusBarOrientation] 

另一个好处是它仍然使用UIInterfaceOrientation枚举,所以你的代码很less需要改变。

从iOS8开始,Applebuild议使用TraitCollections(Size Classes)而不是interfaceOrientation。

而且,由于iOS 9和新的iPadfunction“多任务”,有一些情况下,设备方向不适合窗口比例! (打破你的应用程序界面)

所以在使用Regular Size Classes时也要小心,因为不需要占用整个iPad屏幕。

有时TraitCollections不能满足您的所有devise需求。 对于这些情况,苹果build议比较视图的界限:

 if view.bounds.size.width > view.bounds.size.height { // ... } 

我很惊讶,但你可以在21'15查看WWDC 2015video多functioniOS 9入门。

也许你真的在寻找设备的方向,而不是屏幕或窗口的比例。 如果您关心设备摄像头,则不应使用TraitCollection,也不要使用视图边界。

使用UIDevice的-orientation属性是不正确的(即使它可以在大多数情况下工作),并可能导致一些错误,例如UIDeviceOrientation也考虑设备的方向,如果它是面朝上或向下,没有配对UIInterfaceOrientation枚举这些值。
此外,如果您以某种特定方向locking您的应用程序,UIDevice将为您提供设备定位而不考虑这一点。
另一方面,iOS8已经弃用了UIViewController类的interfaceOrientation属性。
有2个选项可用于检测接口方向:

  • 使用状态栏方向
  • 使用大小类,在iPhone上,如果他们没有被覆盖,他们可以给你一个方法来了解当前的界面方向

还缺less的是一种理解界面方向变化的方法,这在animation过程中非常重要。
在WWDC 2014的“View controller advancement in iOS8”中,演讲者也提供了解决这个问题的方法,使用replace-will/DidRotateToInterfaceOrientation的方法。

这里提出的解决scheme部分实现:

 -(void) viewWillTransitionToSize:(CGSize)s withTransitionCoordinator:(UIVCTC)t { orientation = [self orientationFromTransform: [t targetTransform]]; oldOrientation = [[UIApplication sharedApplication] statusBarOrientation]; [self myWillRotateToInterfaceOrientation:orientation duration: duration]; [t animateAlongsideTransition:^(id <UIVCTCContext>) { [self myWillAnimateRotationToInterfaceOrientation:orientation duration:duration]; } completion: ^(id <UIVCTCContext>) { [self myDidAnimateFromInterfaceOrientation:oldOrientation]; }]; }