繁体   English   中英

iOS 5不会在第二次调用loadView时自动旋转视图

[英]iOS 5 not autorotating view when loadView is called the second time

当我以横向模式运行应用程序时,第二次加载视图控制器的视图并调用loadView ,iOS 5不会将根视图控制器的视图旋转离开肖像,也不会调用视图控制器的willRotate / willAnimateRotation / didRotate方法。

如前所述,只有在视图被卸载并且第二次调用loadView之后,才会发生这种情况。 在我的应用中,有时我会以编程方式卸载视图控制器的视图,然后再将其设置为根视图控制器。 但是,由于内存不足警告而自动卸载视图控制器的视图时,也会发生这种情况。

这仅在iOS 5上发生,而不在iOS 4.x上发生。 在iOS模拟器中很容易重现,这是一个重现此问题的独立测试应用程序的链接:

http://www.mediafire.com/file/7ob5xw5ym02pasx/ViewControllerTest.zip

要查看此问题,只需编译该应用程序,然后使用iOS 5.0 Simulator以横向模式启动它,然后依次单击“ A”和“ Back”,您将看到旋转不会发生。

有任何想法吗? 这与我如何设置window.rootViewController吗?

我调试了它,似乎在4.3和5.0之间进行了更改。 在4.3中,UIKit调用[UIWindow addRootViewController:] ,在5.0中,它调用[UIWindow setRootViewController:] 所以也许有些变化我们看不到...

我建议通过使用[newController setupStuff] (因此将视图设置为nil)来解决此问题,而应覆盖

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // do setup stuff here, reset content etc etc.
}

并在实际显示在屏幕上之前重置(已加载)视图。

附加信息:

a)您不需要将视图设置为nil。 系统会为您执行此操作。 下次访问该视图控制器的view属性时,系统将调用loadView来重新创建视图:

如果访问此属性,并且其值当前为nil,则视图控制器将自动调用loadView方法并返回结果视图。 默认的loadView方法尝试从与视图控制器关联的nib文件中加载视图(如果有)。

b)归结为iOS 5中有关窗口的rootViewController属性的行为。 在iOS 5中,这两个相等:

 self.window.rootViewController = newController;

VS

 [self.window.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
 [self.window addSubview:newController.view];

前者完全忽略了方向,后者则没有。

使事情变得更加复杂的是,如果不覆盖 loadView ,而是让系统自动创建一个空的UIView并仅在viewDidLoad修改该视图,则内存警告不会自动将视图设置为nil并释放它-docs :

 The default implementation releases the view only if it determines that it is safe to do so. 

魔法。 取决于是否覆盖该方法。 我真的无法以任何方式对此进行测试。

情况1-覆盖loadView
触发内存警告调用didReceiveMemoryWarningviewDidUnload

情况2-无loadView
在模拟器中触发内存警告调用didReceiveMemoryWarning ,而不是viewDidUnload

我会说,手动添加视图...

干杯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM