这是 iOS 8 的一个 Bug 吗(旋转时方向问题)?

6
自从iOS 8以来,我的应用程序运行得非常好,但是我在测试这个应用程序时发现了一个问题。它只会在iPad上发生,并且只有在横向模式下启动应用程序时才会出现。如果以纵向模式启动,则一切正常(没有旋转问题)。如果我旋转设备(模拟器或真实设备),则视图会旋转到屏幕外,仅显示真实视图的一部分,其余部分为黑色。

enter image description here

enter image description here

是否还有其他人注意到这样的错误? 我该如何解决?


1
根据您的描述,不看图像,我的初步反应是您可能存在自动布局约束的问题。当您旋转屏幕并返回横向模式时,问题是否消失? - squarefrog
如果我将其旋转回到以横向启动的方式,视图就会正确显示,但如果我旋转它,就会出现错误。但这只会在我以横向启动应用程序时发生。 - Tristan G
你能提供一个第三方网站(如imgur)上的截图链接吗?你设置了哪些自动布局约束? - squarefrog
这是iOS8中shouldAutorotate的一个bug - 在切换到竖屏时未被调用(或将被弃用)。https://dev59.com/1ITba4cB1Zd3GeqP630l - TonyMkenu
在iOS8中,如果您正在使用AutoLayout,则可以使用viewWillTransitionToSize。 - TonyMkenu
viewWillTransitionToSize 对我来说没用,或者我只是太蠢了,不知道如何正确使用它。 - Tristan G
4个回答

5

我有类似的问题。出乎意料的是,解决方法是注释掉Appdelegate中与self.window相关的所有代码。

注释掉了初始化self.window和赋值操作,在属性检查器中通过勾选“Is Initial View Controller”复选框来设置故事板中的初始视图。

新的更好的解决方案
注释掉self.window会导致其他问题。而下面的代码是最佳选择:

- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification 
    {
         [UIViewController attemptRotationToDeviceOrientation];
    }

这对我似乎没有解决问题,但我遇到了完全相同的问题。我的应用程序全部是竖屏,除了一个视图控制器将其放在横屏模式下。如果我旋转视图,它会变得很奇怪。这是在任何尺寸的iPhone上都有iOS 8。 - CodyMace
@CodyMace 我遇到了完全相同的问题。你解决了吗? - doxsi

2
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
BOOL landscape = (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight);
NSLog(@"Currently landscape: %@, width: %.2f, height: %.2f", 
      (landscape ? @"Yes" : @"No"), 
      [[UIScreen mainScreen] bounds].size.width, 
      [[UIScreen mainScreen] bounds].size.height);

结果如下: 针对iOS 8及以上版本:
Currently landscape: No, width: 320.00, height: 568.00
Currently landscape: Yes, width: 568.00, height: 320.00

针对iOS 7及以下版本:

Currently landscape: No, width: 320.00, height: 568.00
Currently landscape: Yes, width: 320.00, height: 568.00

似乎从iOS8开始,在横屏和竖屏模式下处理屏幕高度和宽度的方式发生了变化。
请查看此链接:[UIScreen mainScreen].bounds.size在iOS8中是否变为方向相关?

2
更新 - 我们找到了解决方法:
我找到了下面描述的问题的答案,这个问题似乎与你们的完全相同。我们的另一个开发人员在尝试点击屏幕最右侧时注意到了“主窗口中的意外空值”。这导致我进行了新的搜索,并在stackoverflow上找到了这个帖子,它实际上包含了我们问题的答案。
(这是帮助我回答的问题链接:unexpected nil window in _UIApplicationHandleEventFromQueueEvent
真正的答案来自frankish,他建议打开main.xib(或主故事板),单击其中的窗口,并确保“Visible at Launch”和“Full screen at Launch”属性已选中(设置为true)。
在我们的情况下,只需要设置“Full screen at Launch”属性,但是设置此属性解决了我们看到的旋转问题,并解决了在iPad上启动时无法触摸屏幕最右侧的问题。
更新结束 - (以下是原始非答案)
我的答案不是答案,但我遇到了完全相同的问题。在使用Xcode 6构建时,在我们的应用程序中进行旋转时,我看到与此问题上的截图完全相同的渲染问题。旋转时完全相同的位置不正确,两侧和底部都有黑色条纹。(我们的iPhone应用程序不支持任何旋转,因此我们在iPhone上看不到该问题。在iPad上,我们支持左横向和右横向。当从一个方向旋转到另一个方向时,当iPad执行其标准旋转动画时,它将旋转到不正确的位置(显示黑色条),然后在返回到另一个支持的方向时旋转回正确的位置。我不认为与任何自定义定位或动画代码有关。它发生在每个屏幕上,包括启动画面。它似乎与内置的苹果屏幕旋转有关。显然,并非所有iOS项目都存在这个问题,但我还没有遇到导致这个问题的具体情况。昨天我花了一整天研究这个问题并查看我们的代码,但是我什么也没找到。
额外的信息。如果我使用Xcode 6构建并在装有iOS 7的设备上运行,则没有问题。此问题仅在我使用Xcode 6构建并在装有iOS 8的设备上运行时才会发生。
以下是昨天发布有关此问题的我的问题链接。(在发布我的问题之前,我没有遇到这个问题。) Building project with Xcode 6 (iOS 8 SDK) causes landscape rotation rendering issue on iPad

是的,这只发生在iOS 8上 :) 我用window.visible=false修复了这个问题。 - Tristan G

0

当我的应用程序中有多个窗口时,我发现这是一个问题。通过在-[UIWindow setFrame:]上设置断点,我能够看到在旋转时,系统给我提供了错误的框架大小和位置。您可以通过手动将您的框架设置为等于[UIScreen mainScreen] bounds]来解决此问题,如果您正在运行iOS7+并使用Xcode6进行编译,则似乎是正确的。我发现在-[UIWindow becomeKeyWindow]中执行此操作效果很好:

- (void)becomeKeyWindow {
    [super becomeKeyWindow];

    self.frame = [UIScreen mainScreen].bounds;
}

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