UIViewController view的加載情況,以及frame怎樣改變問題


項目開發的時候遇到一個問題,有一個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屬性,調整縮放大小。 這時發生旋轉后不再滿屏。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM