那么定位的方向很明确,肯定是在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,其他想了解的可以看后面的相关链接
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)