簡體   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