2012-10-01 63 views
1

我推視圖控制器(mainVC)並添加一些子視圖。這些視圖中的大部分都是按需構建的,因爲用戶採取了一些操作。邊界和框架大小在viewDidLoad

當我構建每個視圖時,我參考mainVC.view.bounds來確定視圖的大小。那些建立在需求上的尺寸很好,但第一個(我在viewDidLoad中添加的)似乎沒有考慮隱藏的導航欄或非隱藏的工具欄 - 我不確定哪一個。

其他問題似乎可以確保viewDidLoad是指向邊界並添加這些子視圖的正確位置。我誤解了嗎?測井產生以下:

viewDidLoad邊界高度是548

viewWillAppear邊界高度是460(-44×2)。在viewWillAppear我隱藏了導航欄,但前後的高度是一樣的。

在以後的所有時間,邊界高度是504(-44 x 1)。

爲什麼邊界高度在我試圖在viewDidLoad中讀取它時沒有更新?

+0

我認爲當第一次加載筆尖時,視圖就是您設置的任意大小。當它作爲窗口的子視圖結束時,系統會根據它所在的位置(我假設)調整它的大小。請注意,沒有「硬」大小 - 我啓用了共享功能,因此視圖比正常情況下縮短了20個像素。 –

回答

4

視圖控制器生命週期在View Controller Programming Guide for iOS中描述。

總之,當-view被稱爲第一次,-viewDidLoad被稱爲。即使視圖控制器對視圖做的第一件事是設置了框架,它仍然需要訪問該視圖。

UIViewController *controller = [MyViewController myViewController]; 

// -viewDidLoad has not been called (if +myViewController doesn't call -view.) 

UIView *view = [controller view]; 

// -viewDidLoad has been called. 

view.frame = [UIApplication sharedApplication].delegate.window.bounds; 

即使你使用controller.view.frame相同的邏輯順序發生。 -viewDidLoad將始終是一個調用一個新的反序列化視圖,尚未嵌入到視圖層次結構中。


更新

它區分它不早清楚,我指出了爲什麼鑑於界限不-viewDidLoad正確設置。只有在-viewDidLoad之後視圖控制器的視圖才被添加到視圖層次結構中。這是當視圖的最後一幀被設置時。

如果您必須使框架尺寸合適,可以使用IB設置您需要的尺寸或(如果您不使用IB)將框架設置爲-loadView。這種方法存在缺陷,因爲它將幀的大小靜態設置爲可在調用-viewDidLoad之後更改的值(例如通話狀態欄)。


更新2

您需要將添加子視圖的位置和大小子視圖分裂。

如果您從故事板或筆尖加載,那麼您是正確的,需要在-viewDidLoad中添加所需的其他視圖。如果以編程方式加載,則所有子視圖都將添加到-loadView中。

第二項任務是定位和調整子視圖的大小。首選的方法是使用UIView.autoresizingMask,但更精確的佈局,KVO view.bounds和視圖控制器的視圖更改其大小時調整您的自定義子視圖。

+0

即使我在創建控制器後立即請求[控制器視圖],它也沒有區別。首先我創建控制器。其次,我(現在)只是將控制器的視圖分配給一個變量 - 只是爲了引用它。然後我改變框架。對於任何需求加載的週期,它都可以工作 - 對於主VC中的視圖didLoad中觸發的任何事件,它都不會。 如果我誤解了,並且在您的示例中提到了我的mainVC,那麼我如何在啓動時加載一些其他視圖控制器並添加它們的視圖? –

+0

對不起,也許我不清楚'-viewDidLoad'總是會在最後的界限或幀被設置之前被調用。總是。你無能爲力。 –

+0

我應該在哪裏添加子視圖?有鑑於此,似乎我會做很多不必要的後處理。 –