ViewController在iOS8设备旋转后偏移

我在iOS8中运行遗留代码时遇到了一个奇怪的问题。 该代码最初是在iOS6之前编写的,故事板(使用笔尖),在iOS7上运行时没有问题。 然而,在iOS8上运行时,奇怪的行为开始发生。

该应用程序设置为只在横向(左或右)运行。 因此它应该支持从横向到横向的自动旋转。 第一个问题是,最初的视图控制器被加载成肖像,一面被切断。 AppDelegate中的以下代码解决了此问题:

self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; [self.window setFrame:[[UIScreen mainScreen] bounds]]; 

改变这些调用顺序允许视图控制器以正确的方向加载,并且不影响在iOS7中运行的应用程序。 但是,现在当设备旋转180度,我得到以下结果。 查看图片…

这是在初始负载的应用程序: 在这里输入图像说明

经过180度的旋转,我得到了这个抵消效应: 在这里输入图像说明

任何想法如何解决这个问题? 再说一次,iOS7或以前的版本都可以。 谢谢!

当iOS 8第一次出现的时候,我遇到了和你一样的问题,与开幕式的创作咒语无关! 它与你的Info.plist有关Info.plist中列出的第一个方向是根视图控制器实际允许的方向,这一点至关重要。

所以,让我们说你的根视图控制器只允许风景。 那么如果你的Info.plist如下所示,你将会得到你描述的问题:

 <key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeRight</string> </array> 

看到错误? 肖像首先。 没有 。 如果根视图控制器只允许风景,则其中一个风景方向必须先出现。

[你实际上可以看到我遇到了这个问题,然后发现并报告解决scheme,在这里: https : //stackoverflow.com/a/24467576/341994]


另外,我不得不怀疑,你是否可能会做其他任何使轮换系统不安的事情。 请注意,旋转的本质,包括坐标系,旋转什么,旋转等等,在iOS 8中已经完全改变了; 这可能是iOS 8中最大的单一改变。所以,如果你有一些旧的代码,对什么是旋转(例如,它涉及到一个转换)做出了底层的假设,那么代码将会破坏。 你没有在你的问题中显示任何这个,所以我不能提供你可能在做什么的细节。


最后,只是为了logging,正确的最小开放咒语是(这是Swift代码,但我相信你可以翻译):

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { self.window = UIWindow(frame: UIScreen.mainScreen().bounds) self.window!.rootViewController = UIViewController() // or whatever it is self.window!.backgroundColor = UIColor.whiteColor() self.window!.makeKeyAndVisible() return true } 

您应该在视图控制器上使用一些自动布局约束,以便它粘在父容器的左侧/上侧和下侧。

这里有一些想法:

1)用一个框架初始化你的窗口,不要以后再设置

 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

2)确保你的rootViewController视图的autoresizingMask是FlexibleWidth + FlexibleHeight,并且你没有灵活的页边空间。

3)确保您的应用程序的目标明确地只有在常规 – >部署信息部分所需的方向。 这听起来像你只有进入你想要的方向,但只是检查,以确保!

我把我们的应用程序从iOS 7.x移植到iOS 8.4时,浪费了一整天的时间。 设备旋转后,视图有神秘的抵消了错误的尺寸。

我们的应用程序使用UITabBarController作为RootViewController,并且选项卡的数量可以dynamic改变。 在iPad上,所有视图都支持所有的方向。 在iPhone上,只有一个视图可以旋转,其他所有的都被牢固地设置为肖像。 因为视图的数量可以dynamic变化,所以我有一个属性可以存储每个视图的可能方向。 每次从iOS调用UIViewController.supportedInterfaceOrientations()时 ,都会返回属性的内容。

在debugging问题时,我注意到函数UIViewController.supportedInterfaceOrientations()在AppDelegate之后立即被调用,调用函数UIWindow.MakeKeyAndVisible() 。 在这个时候,我的代码没有机会初始化属性,所以UIViewController.suppoertedInterfaceOrientations()返回0到iOS。 我更改了代码,以便在调用UIWindow.MakeKeyAndVisible()之前对属性进行初始化后,神秘的大小和偏移量问题就消失了!

我的结论是:不要把iOS弄错了或丢失了UIViewController.supportedInterfaceOrientations()函数;-)