iOS8中设备旋转后的ViewController偏移量

时间:2014-11-07 23:34:47

标签: ios uiviewcontroller ios8 autorotate

我遇到了在iOS8中运行遗留代码的奇怪问题。该代码最初是在iOS6之前编写的,故事前预告板(使用笔尖)并且在iOS7上没有问题。但是,在iOS8上运行时开始出现奇怪的行为。

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

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

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

这是初始加载时的应用: enter image description here

旋转180度后,我得到了这种偏移效果: enter image description here

有关如何解决此问题的任何想法?同样,iOS7或之前的一切都很好。谢谢!

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

因此,假设您的根视图控制器仅允许横向显示。如果您的Info.plist如下所示, 解决您描述的问题:

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

看到错误?肖像是第一位的。 没有。如果根视图控制器仅允许横向,则其中一个横向方向必须首先出现。

[您实际上可以看到我遇到问题,然后在此处发现并报告解决方案:https://stackoverflow.com/a/24467576/341994]


另外,我不得不怀疑你是否正在做任何扰乱旋转系统的 else 。请注意,旋转本身的性质,包括坐标系,旋转时,旋转时等,在iOS 8中完全改变;这可能是iOS 8中最大的单一变化。因此,如果你有一些旧的代码可以对旋转的内容进行底层假设(例如它涉及转换),那么该代码现在就会破坏。您没有在问题中显示任何内容,因此我无法提供您可能正在做的具体内容。


最后,只是为了记录,正确的最小开口咒语是(这是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
}

答案 2 :(得分:0)

以下是一些想法:

1)用框架初始化你的窗口,之后不要设置它

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

2)确保rootViewController视图的autoresizingMask为FlexibleWidth + FlexibleHeight,并且您在那里的任何地方都没有灵活的边距。

3)确保您的应用程序目标在General-&gt;部署信息部分中明确只有您想要的方向。听起来你只是进入了你想要的方向,但只需检查一下以确保它!

答案 3 :(得分:0)

在将我们的应用程序从iOS 7.x迁移到iOS 8.4时,我浪费了一整天的类似问题。设备旋转后,视图的神秘偏移量大小错误。

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

在调试问题时,我注意到在AppDelegate调用函数 UIWindow.MakeKeyAndVisible()之后立即调用了函数 UIViewController.supportedInterfaceOrientations()。目前,我的代码没有机会初始化属性,因此 UIViewController.suppoertedInterfaceOrientations()将0返回给iOS。在我更改代码以便在调用 UIWindow.MakeKeyAndVisible()之前初始化我的属性之后,神秘主义者 尺寸和偏移问题都消失了!!!

我的结论:不要使用错误或缺少UIViewController.supportedInterfaceOrientations()函数来搞乱iOS; - )