UITraitCollection iPad 如何检测当前方向

UITraitCollection iPad how to detect the current orientation

因为 iOS8 检测 UIViewController 方向的方法已弃用。
例如 -interfaceOrientation 已被弃用,为了检测当前视图控制器的方向,我们似乎需要向视图控制器上的 -traitCollection 属性 询问此信息。
我有点困惑 iPad 他的特征在两个方向上都设置为常规。
检测当前方向的最佳方法是什么?

查找 UIDevice 的 UIDeviceOrientation 部分及其方向 属性。文档是 here。这就是我进行定向检查的方式。您还可以查看屏幕宽度是否大于屏幕高度,因为有时,尤其是在应用程序首次启动时,它将是 UIDeviceOrientationUnknown。

最佳做法是使用尺寸 类 而不是设备方向。

iPad 在两个方向上都有规则的大小,因为无论方向如何,iPad 在垂直和水平方向上都有足够的空间容纳内容。

您应该考虑为什么希望 iPad 以不同方式处理纵向和横向显示,并在此处更清楚地解释为什么尺寸 类 不能满足您的需求。

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

  • 使用状态栏方向
  • 使用大小 classes,在 iPhone 如果它们没有被覆盖,它们可以让您了解当前的界面方向

仍然缺少一种理解界面方向变化方向的方法,这在动画中非常重要。
在 WWDC 2014 session "View controller advancement in iOS8"演讲者也提供了解决该问题的方法,使用替换 -will/DidRotateToInterfaceOrientation 的方法。

此处建议的解决方案已部分实施:

-(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];
      }];
}

自 iOS9 和新的多任务功能以来,Apple 建议使用 TraitCollection 或比较视图边界以满足您的设计需求。

看看我对类似问题的回答: