簡體   English   中英

在 UIViewController 中布局和調整子視圖的大小

[英]Laying out & sizing of subviews in a UIViewController

我有一個帶有UITabController<\/code>的應用程序,每個選項卡都是一個UINavigationController<\/code> 。 我的UINavigationControllers<\/code>之一的根是UIViewController<\/code> 。

在該視圖控制器的視圖中,我想布局一些子視圖,但我對在哪里以及如何以獨立於分辨率的方式布置它們感到困惑(即不是硬編碼值,例如 320px、480px、44px 等。 )。

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

在視圖控制器內部,我目前在viewDidLoad<\/code>方法中創建了所有子視圖。 但是,在此方法中,視圖的當前高度似乎是 460 像素( self.view.bounds.size.height<\/code> )。 所以在設置我的子視圖時,我無法正確計算任何東西的大小。

viewWillAppear:<\/code>方法中,視圖確實<\/strong>知道它的大小合適,但這意味着每次視圖出現時都要設置和計算子視圖的框架(例如,選項卡更改或從導航堆棧上的子視圖控制器彈出。

是在viewWillAppear:<\/code>中正確布局的唯一方法嗎?

我曾嘗試使用自動調整屬性(父母的autoresizesSubviews<\/code>和autoresizingMask<\/code> ),但它們似乎根本不起作用!? 這些是否僅在視圖全部設置好然后調整大小(手動\/方向更改?)后才生效。

如果有人能讓我知道為什么自動調整大小不起作用,以及如何通過不硬編碼任何大小來最好地布置東西,我將不勝感激。

您可以在UIViewControllerviewWillLayoutSubviews中執行布局邏輯。

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

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

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

loadView您應該調整子視圖的大小以適應當前父視圖的大小,然后根據上面的掩碼設置,當父視圖從460到367像素的大小調整時,您的子視圖也將調整大小。

如果失敗,在viewWillAppear中設置視圖大小沒有任何問題 - 每次這樣做的性能影響可以忽略不計。

如果沒有其他工作,總會有layoutSubviews: - 如果必須,你可以進行手動布局,當系統認為布局可能需要改變時,它會被調用。 還有setNeedsLayout :我有時會從viewWillRotate: / viewDidRotate :等調用。但實際上這不應該是需要的,並且自動調整應該足夠好。

編輯:是的,要在layoutSubviews實現自定義布局邏輯,如上所述,需要子類UIView

斯威夫特 5:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
// Your Code
    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM