iOS 8 和 UIScreen 大小问题
iOS 8 and UIScreen sizing issues
我们的应用程序由 Cocos3D 和 AR 组成。自升级到 iOS 8 以来,由于 Apple 给我们带来的变化,我们不得不修复我们的方向处理。
然而,我们仍然遇到一些问题,这些问题导致我发现了一个相当有趣的现象(我在我们的应用程序和一个全新的项目中检查过它..):
记录[UIDevice currentDevice].orientation
、[UIApplication sharedApplication].statusBarOrientation
和[UIScreen mainScreen].bounds.size
表明,当设备快速旋转时,设备方向实际上发生了变化,但界面方向有时会保持不变,这导致错误的屏幕边界计算...例如:
旋转前:
[UIDevice currentDevice].orientation = 1
[UIApplication sharedApplication].statusBarOrientation = 1
[UIScreen mainScreen].bounds.size = 414x736
第一次轮换后:
[UIDevice currentDevice].orientation = 4
[UIApplication sharedApplication].statusBarOrientation = 4
[UIScreen mainScreen].bounds.size = 736x414
第二次轮换后:
[UIDevice currentDevice].orientation = 1
[UIApplication sharedApplication].statusBarOrientation = 4
[UIScreen mainScreen].bounds.size = 736x414
现在很明显,在第二次旋转之后,设备又回到了纵向模式——当然不是根据界面方向和屏幕边界...
我是不是漏掉了什么?
我过去遇到过这个问题并得出结论,当您为 UIDeviceOrientationDidChangeNotification
设置观察者时,您指定的方法会在所有属性更改以反映新方向之前被调用。我处理它的方法是创建一个函数,它在延迟后运行一段代码,然后调用:
- (void)deviceOrientationDidChange:(NSNotification *)note
{
RHRunBlockAfterDelay(0.5, ^{
// Execute relevant code...
});
}
延迟函数是对在单独的 Functions.h
.
中定义的 [self performSelector:@selector(mySel) afterDelay:delay withObject:block];
调用的包装器
我们的应用程序由 Cocos3D 和 AR 组成。自升级到 iOS 8 以来,由于 Apple 给我们带来的变化,我们不得不修复我们的方向处理。
然而,我们仍然遇到一些问题,这些问题导致我发现了一个相当有趣的现象(我在我们的应用程序和一个全新的项目中检查过它..):
记录[UIDevice currentDevice].orientation
、[UIApplication sharedApplication].statusBarOrientation
和[UIScreen mainScreen].bounds.size
表明,当设备快速旋转时,设备方向实际上发生了变化,但界面方向有时会保持不变,这导致错误的屏幕边界计算...例如:
旋转前:
[UIDevice currentDevice].orientation = 1
[UIApplication sharedApplication].statusBarOrientation = 1
[UIScreen mainScreen].bounds.size = 414x736
第一次轮换后:
[UIDevice currentDevice].orientation = 4
[UIApplication sharedApplication].statusBarOrientation = 4
[UIScreen mainScreen].bounds.size = 736x414
第二次轮换后:
[UIDevice currentDevice].orientation = 1
[UIApplication sharedApplication].statusBarOrientation = 4
[UIScreen mainScreen].bounds.size = 736x414
现在很明显,在第二次旋转之后,设备又回到了纵向模式——当然不是根据界面方向和屏幕边界...
我是不是漏掉了什么?
我过去遇到过这个问题并得出结论,当您为 UIDeviceOrientationDidChangeNotification
设置观察者时,您指定的方法会在所有属性更改以反映新方向之前被调用。我处理它的方法是创建一个函数,它在延迟后运行一段代码,然后调用:
- (void)deviceOrientationDidChange:(NSNotification *)note
{
RHRunBlockAfterDelay(0.5, ^{
// Execute relevant code...
});
}
延迟函数是对在单独的 Functions.h
.
[self performSelector:@selector(mySel) afterDelay:delay withObject:block];
调用的包装器