2014-10-06 16 views
11

我有一個xib文件,用自動佈局表示一個簡單的視圖,我用[[NSBundle mainBundle] loadNibNamed:@"name"][0]實例化並添加到編程式創建的UIView,通過addSubview:嵌入編程式UIView的自動佈局XIB不會調整到父

問題是視圖不能伸展以滿足嵌入視圖的大小;相反,它似乎是默認的xib文件中指定的大小。 (我也找不到在xib文件中僅限其子視圖的容器視圖本身的約束條件)

也有點奇怪,當我旋轉iPad時,視圖的寬度會進一步按比例縮小。所以它顯然是以某種方式連接起來的,但是具有錯誤的初始值。

我錯過了什麼連接以使該嵌入式視圖適合視圖層次結構?

截圖(增加了調試品紅色):

screenshot 1

旋轉爲縱向後:

screenshot 2

回答

18

它不調整自身,以填補其新的上海華盈的原因你還沒有安排它這樣做。簡而言之,您需要在代碼中添加約束條件,以在將兩個視圖添加到另一個視圖之後關聯這兩個視圖。

最有可能的是,IB設置視圖來將其自動調整掩碼轉換爲約束。當NIB設置爲使用自動佈局時,它的自動調整掩碼很難確定。

無論如何,當您將其添加到超級視圖時,自動生成的約束將保留其當前幀。當超級視圖調整大小時,它們根據自動調整屏蔽來調整它的大小(可能允許寬度和高度變化,但不超過超視圖邊緣的距離)。

當你使用自動佈局時,應做到以下幾點:

  • 無論在NIB 關閉translatesAutoresizingMaskIntoConstraints在其中增加了上海華代碼將其關閉。您採用哪種方法取決於您是否預期將視圖添加爲管理子視圖佈局的框架視圖類的子視圖。如果可能的話,那麼你應該把它留在NIB,讓這個班級決定是否關閉它。

  • 將視圖添加到其超級視圖後,向超級視圖添加約束,以控制視圖佈局的位置。

+5

感謝您的幫助。這太糟糕了,Xcode不允許在界面構建器中爲此設置約束。通常我喜歡在代碼中做事,但自動佈局絕對不是這些事情之一。 ;)我最終安裝了** PureLayout **庫(https://github.com/smileyborg/PureLayout),其'autoPinEdgesToSuperviewEdgesWithInsets'方法運行良好。乾杯! – devios1 2014-10-07 17:29:40

+2

不客氣。約束涉及兩種觀點。在NIB的視圖中,超視圖不存在,因此沒有任何與約束有關的內容。此外,約束條件必須添加到超級視圖中,而不是添加到NIB中的視圖。最後,視圖NIB的一個重要用例是可用於各種上下文的視圖。這個觀點並不適合以任意的方式來規定它與周圍環境的關係。這是加載它並將其添加到另一個視圖層次結構中的控制器的工作。 – 2014-10-08 00:57:16

+0

我不知道3年是否改變了這一點,但是當你說「在視圖NIB中,超視圖不存在」時,我想:但是在故事板中,該類的視圖已放置在場景中,那裏應該有足夠的信息來確定超級觀點。恕我直言,國際局應該只是處理。除非我錯過了一些東西,Xcode人只是聳聳肩,說我們不值得花時間來增加這個功能。 – 2017-11-27 23:47:23