2010-01-10 29 views
48

我有一個應用程序,使用UITabController,每個標籤是UINavigationController。我的UINavigationControllers之一的根是UIViewController在UIViewController中佈置和設定子視圖的大小

在該視圖控制器的視圖中,我想佈置一些子視圖,但我很困惑,在哪裏如何將它們放在一個獨立於分辨率的方式(即不是硬編碼值,如320px,480px, 44px等)。

當視圖完全加載並呈現在垂直iPhone上時,其高度將爲367px = 480 - 20(狀態欄) - 44(導航欄) - 49(標籤欄)。

在視圖控制器中,我目前在viewDidLoad方法中創建了所有子視圖。但是,看起來在這種方法中,視圖的當前高度是460px(self.view.bounds.size.height)。所以在設置我的子視圖時,我無法正確計算任何東西的大小。

viewWillAppear:方法,認爲知道這是適當的大小,但是這意味着設置&每個視圖會出現時間(例如標籤的變化來計算子視圖的框架或子視圖控制器導航堆棧上彈出。

是在viewWillAppear:

適當做這個佈局的唯一方法我已經使用自動尺寸屬性嘗試(父母的autoresizesSubviews & autoresizingMask),但他們似乎並沒有在所有的工作!?做這些只有在視圖全部設置後才能生效,然後調整大小(手動/方向更改?)。

如果有人能告訴我爲什麼autoresizing不起作用,以及如何通過不對任何大小進行硬編碼來最好地解決問題,我將不勝感激。

回答

32

autoresizesSubviews應該設置在你的父視圖上,而autoresizingMask應該設置在子視圖上 - 這是我犯的錯誤,所以你也可以。

loadView你應該調整你的子視圖以適應目前父視圖的任何大小,然後在父視圖從460到367像素調整大小時,你的子視圖也將被調整大小,根據你的上面的掩碼設置。

如果失敗,將視圖大小設置在viewWillAppear內沒有任何問題 - 每次執行此操作的性能影響可以忽略不計。

如果沒有其他工作,總是有layoutSubviews: - 如果必須的話,你可以做手動佈局,當系統認爲佈局可能不得不改變時調用它。也有setNeedsLayout:我有時從viewWillRotate:/viewDidRotate調用:等等。但真的這不應該需要和autoresize應該足夠好。

編輯:是的,爲了實現layoutSubviews中的自定義佈局邏輯,正如我在上面提到的那樣,需要繼承UIView的子類。

+2

快速說明,UIViewController沒有,也沒有調用layoutSubviews。這是UIView上的一個方法。但是,您可以製作一個名爲layoutSubviews的方法,並從viewWillAppear調用該方法: – casademora 2011-04-10 19:27:07

+1

也沒有「loadViews」。我認爲你的意思是「viewDidLoad」,在這種情況下,值得一提的是在viewDidUnload中也釋放這些視圖。 – DougW 2011-06-01 00:19:07

+0

有一個loadView方法,但viewDidLoad通常是添加子視圖最方便的地方 – 2011-09-04 00:42:23

40

您可以在UIViewControllerviewWillLayoutSubviews內部執行佈局邏輯。

-(void)viewWillLayoutSubviews{ 
    [super viewWillLayoutSubviews]; 
    // Your layout logic here 
} 

DOC:在視圖控制器視圖的layoutSubviews方法被調用之前調用。子類可以根據需要實現。默認值是一個nop。

+2

任何區別,如果我使用viewDidLayoutSubviews而不是? – 2015-09-25 14:11:16

相關問題