2012-10-08 27 views
14

我有一個視圖,它在代碼中執行其子視圖的佈局。佈局對於自動佈局太複雜,自動佈局會破壞佈局代碼。有沒有辦法強制自動佈局離開這個視圖的子視圖?我試過壓倒layoutSubviews,但沒有喜悅。爲單個視圖選擇自動佈局嗎?

感謝您的任何幫助。

回答

5

根據故事板或XIB啓用或禁用自動佈局。如果您的視圖位於其自己的XIB中,那麼您可以禁用該XIB的自動佈局。如果您的XIB中有其他視圖依賴於自動佈局,則必須找到不同的解決方案。

+1

把它放在它自己的NIB似乎是唯一的解決方案。 –

+0

是的,它吮吸你無法打開或關閉每場景。 – Flea

+0

只要你在自動佈局引擎完成之後,你就可以手動爲某個給定的視圖定位子視圖(即設置它們的框架)(見下面的答案)。 – wcochran

2

在WWDC視頻中找到答案。 layoutSubviews在自動佈局下與以前不一樣。它不會停止自動佈局的發生,而是在佈局過程中添加/更改/刪除約束的機會。

昨晚我試着將自定義視圖移動到不同的NIB,這似乎是唯一的解決方案。

2

You can mix auto layout and manual layout!

只要沒有視圖的子視圖的參與任何汽車佈局限制,將觸發另一個自動佈局通過該視圖,您可以覆蓋layoutSubviews並設置每個子視圖手動框架:

class MyView : UIView { 

    // 
    // mySubview is not involved in any constraints 
    // that would trigger another layout pass. 
    // e.g., no explicit constraints set in IB. 
    // 
    @IBOutlet weak var mySubview: UIView! 

    override func layoutSubviews() { 
     super.layoutSubviews() // let auto layout engine run first 

     // 
     // Auto layout engine now done with this view so we can 
     // set the frames how ever we wish since we have the last 
     // word! 
     // 
     mySubview.frame = CGRectMake(...) 
     ... 

    } 

} 

這個原因的工作原理是,在之後調用,更改任何子視圖上的框架而不是會觸發另一個佈局傳遞(與子視圖相關的所有約束均已滿足,並且自動佈局引擎已完成); 因此,這種方法得到其子視圖的最後一個字!

  • 注意MyView實例可以有相關的汽車佈局限制設置,一切工作正常。

  • IB發出沒有警告,只要你做設置子視圖的任何約束。

+0

在macOS上,子類的方法是'layout'。 – Demitri