項目開發的時候遇到一個問題,有一個controller的view無論在viewdidload還是viewdidAppear里怎么也改不了它的大小。 改成1024*768,之后又會變成768*1024. 網上查了很多資料,決絕不了。 於是自己看了些官方文檔,寫了一個demo來測試。 算有了些眉目。 對controller的view加載過程又有了進一步的認識。
一、view的加載過程
contrller初始化是並未對view進行處理,這時view的屬性為nil。 之后一旦訪問view的屬性,只要為nil,那么則會開始加載view。 如果有nib,則會從nib自動加載。 如果沒有則調用controller的loadview方法。 此時在loadview里,若使用【super loadview】則會根據window的大小,創建一個默認的view。 如果要自定義view,則不要去調這行代碼。 之后view屬性設置好以后,則會調用viewdidload; 而viewWillAppear和viewDidAppear則是在addsubview的時候調的,(調試時可以看到以下調用信息。猜想是判斷view有沒有controller,有的話在addsubview的時候就去調viewWillAppear和viewDidAppear)。
-[UIView(Hierarchy) addSubview:] -[UIViewController _setViewAppearState:isAnimating:]
-[TestviewController viewDidAppear:]
二、controller的veiw改變大小。
在TestViewController里,viewDidLoad里改變它自己view的大小有效了,是可以改變的。 那么為什么會存在之前的問題呢? 仔細分析后是因為之前那個controller設置的是window的rootViewController,而window的開始是設定好的,此時它rootviewcontroller的view的大小則是恆定的(始終為滿屏顯示),在rootviewcontroller里無法更改。更改的辦法必須在[self.window makeKeyAndVisible] 用controller.view.frame = XXX 更改。但是問題又出現了,更改一次可以,但是一旦發生旋轉,又回到滿屏狀態。
原因是在window的rootviewcontroller 在旋轉時,環境context是window,會以滿屏顯示的尺寸去重新剪裁和layout,導致rootviewcontroll的view又滿屏顯示。此時可以在 rootviewcontroller 的 -(void)viewWillLayoutSubviews里設置view的frame
- (void)viewWillLayoutSubviews { self.view.frame = CGRectMake(0, 0, 50, 50); }
同時可以設置autoSizeMask屬性,調整縮放大小。 這時發生旋轉后不再滿屏。