![](/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.