如何在iOS 8扩展中获取当前界面方向?

7

UIViewController的InterfaceOrientation已经被废弃,文档建议使用[[UIApplication sharedApplication] statusBarOrientation],但在iOS 8的扩展中不存在sharedApplication。


如@Retro所提到的,在大多数情况下,您可以在UIViewController中使用self.traitCollection.verticalSizeClassself.traitCollection.horizontalSizeClass来获取方向信息。

4个回答

11

UITraitCollection对象提供有关UIViewController对象的特性详细信息,UIViewController管理构成应用程序界面一部分的一组视图。这些特征或特性定义了视图控制器的大小类、显示比例和设备习惯用语。当创建视图控制器时,会自动为该视图控制器创建一个trait collection。

您可以创建并修改视图控制器的trait collection以自定义应用程序。以下方法创建仅包含传递参数的新trait collection:

traitCollectionWithDisplayScale:

traitCollectionWithUserInterfaceIdiom:

traitCollectionWithHorizontalSizeClass:

traitCollectionWithVerticalSizeClass:

不幸的是,特质集合不包括方向。为什么苹果建议将其作为[UIViewController interfaceOrientation]的合适替代品,这超出了我的理解范围。 - cetcet
2
这个想法是你不应该再过多考虑“方向”,而是要从尺寸类别的角度来思考。你的界面需要具有适应性,特别是考虑到新的iOS9多任务视图,设备的方向不能准确地判断在给定点上你的布局应该是什么样子的。 - Z S
这对于像AVFoundation这样方向对从相机解析数据有影响的情况来说是不够的。 - jjxtra

3

不是已弃用的,适用于任何设备屏幕尺寸(包括苹果今年将发布的未来屏幕尺寸)。

-(void)viewDidLayoutSubviews {
    NSLog(@"%@", self.view.frame.size.width == fminf([[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height) ? @"Portrait" : @"Landscape");
}

感谢@anneblue帮忙缩短了代码!

1
由于您的解决方案将屏幕的较小维度与视图的宽度进行比较,因此我将其简化为以下内容:self.view.frame.size.width == fminf([[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height) ? @"Portrait" : @"Landscape" - anneblue
@anneblue 太好了!谢谢你。我还没有时间测试它,(我相信它会工作),如果你已经测试过了,请随意将其编辑到我的答案中! - Albert Renshaw
@anneblue 我会编辑它的,很抱歉你的编辑被其他成员拒绝了。 - Albert Renshaw
我期待着有一天苹果能够效仿NEC的做法,推出一个1:1的宽高比iOS设备。 - Anton Tropashko

-1

您可以将屏幕边界转换为键盘视图的坐标系。之后,您可以检查宽度或高度哪个更大。


-3

简单 - 只需使用:

[[UIApplication sharedApplication] statusBarOrientation]


这实际上只在应用程序中起作用。一旦您想在Safari扩展或类似的地方读取方向,最好使用[[UIDevice currentDevice] orientation] - https://dev59.com/NGsz5IYBdhLWcg3wVGTJ - igraczech

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