![](/img/trans.png)
[英]iOS7 View moves under status/nav bars when loadView called again
[英]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
:
触发内存警告调用didReceiveMemoryWarning
和viewDidUnload
情况2-无loadView
:
在模拟器中触发内存警告仅调用didReceiveMemoryWarning
,而不是viewDidUnload
我会说,手动添加视图...
干杯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.