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]; 调用的包装器