controller的view無法改變frame

開發過程中發現,有一個controller的view無論在viewdidload還是viewdidAppear里怎么也改不了它的大小。

1、 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:]

2、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屬性,調整縮放大小。 這時發生旋轉后不再滿屏

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。