UIInterfaceOrientation和UIDeviceOrientation的区别

UIInterfaceOrientation和UIDeviceOrientation长得是又长又像,长久时间我根本没有区分这两个类型,肯定也混用了无数,直到我现在处理的一个问题,明明是横/竖屏的情况,控件却是以竖/横的布局展示,而且我在模拟器上怎么都搞不出来,而测试稍微把机器转转圈就能重现这个现象。

那么定位的方向很明确,肯定是在willRotateToInterfaceOrientation之类的函数里咯。于是我看到了这样的代码

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

{

...

CGRect rect

if ( ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait) ||

[[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown ) {

rect = HRECT

}

else {

rect = VRECT

}

[alertView setFrame:rect]

...

}

乍一看其实也没什么,竖屏的时候就用竖屏的frame布局,此外就用横屏的布局,这没有什么问题啊。然后我抱着试试看的心里,跳到了UIDeviceOrientationPortrait的定义,突然发现这个枚举值竟然有七个,除了一个unknown之外,还有上下,左右,翻盖这六种。这个时候我才注意到,程序里用的类型是UIDeviceOrientation,而切换横竖屏的函数的参数实际上是UIInterfaceOrientation,这可把我吓出一身冷汗,以前从来没注意过,都是随便找之前写的代码抄过来判断横竖屏的,那么一旦误用会有多少问题啊。于是我找了一下资料,来源主要是这里 。

而且两者除了区别还有联系,打开头文件大家也可蠢中以看到

typedef enum {

UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,

UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,

UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,

UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft

} UIInterfaceOrientation

也就是意味着竖屏的时候两者的值是完全对应,而横屏的时候相反的对应关系则反应了向左摇的时候,设备正好是朝着右边的,也有人说HOME在右边。

还有就是UIDeviceOrientation一定会根据设备当前的位置朝向而改变,但UIInterfaceOrientation则未必,比如你根本不让设备转动的话,那么怎么都是获得到UIInterfaceOrientationPortrait这个值的。

如果你的设备支持摇动,那么直接在willRotateToInterfaceOrientation的函带轮山数桐返里根据参数即可获得当前状态,而万一遇到新界面没有获得摇动消息却要确定当前状态,那就用[UIApplication sharedApplication].statusBarOrientation写在viewWillAppear之类的函数里。当然最方便最合适的做法是用UIInterfaceOrientationIsPortrait和UIInterfaceOrientationIsLandscape两个预设宏。

这里羡陆先兄激顷说UIDevice,其他想了解的可以看后面的相关链接

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8150436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存