UITraitCollection iPad如何检测当前方向

3

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

4个回答

2

使用UIDevice-orientation属性是不正确的(即使在大多数情况下它可以工作),可能会导致一些错误,例如UIDeviceOrientation还考虑设备是否朝上或朝下,UIInterfaceOrientation枚举中没有这些值的对应项。
此外,如果你锁定你的应用程序在某个特定的方向上,UIDevice会给出设备方向而不考虑这一点。
另一方面,iOS8已经弃用了UIViewController类的interfaceOrientation属性。
有两种选项可以用来检测接口方向:

  • 使用状态栏方向
  • 使用大小类,在iPhone上,如果它们没有被覆盖,它们可以为您提供了解当前接口方向的方法。

仍然缺少的是一种了解接口方向更改方向的方法,在动画过程中这非常重要。在WWDC 2014年“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];
      }];
}

1
最佳实践是使用大小类而不是设备方向。
iPad在两个方向上都有常规尺寸,因为无论方向如何,iPad在垂直和水平方向上都有足够的内容空间。
您应该考虑为什么希望在纵向和横向方向上以不同方式处理iPad显示屏,并在此更清楚地解释为什么大小类不能满足您的需求。

3
有时候仅仅是因为顾客需要。此外,在一场2014年的WWDC会议上,他们也解释了如何实现这一点。 - Andrea

1

iOS 9及其新的多任务功能中,苹果建议使用TraitCollection或与视图边界进行比较以适应您的设计需求。

请查看我在类似问题上的回答: 苹果建议您比较视图边界


1

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


我认为UIDeviceOrientation不应该被用作UIInterfaceOrientation的替代品。事实上,如果你把你的设备倒过来,你会得到这个方向而不是界面方向。当你需要一个设备的三维表示而不是二维界面时,UIDeviceOrientation表现良好。 - Andrea
那我可能误解了你的意图。 - Doug Watkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接