2013-11-26 36 views
0

我真的希望我可以讓自己的頭部繞過自動佈局。似乎每當我閱讀關於事情應該如何工作的抽象描述時,都是有道理的,但每當我真正嘗試並將其付諸實踐時,總是會引起大量頭痛。所以,如果已經有一個答案在這裏,但我找不到一個道歉。使用AutoLayout並確保父視圖的邊界在調整大小時適合子視圖

問題應該比較簡單。我有一個容器視圖,其中包含兩個子視圖,猙獰的顏色最大的可讀性:)如下所示:

enter image description here

底部(黑色)認爲,應該保持它的當前大小和維護之間的間距和紅色視圖,以及它本身和黃色視圖底部之間的間距。 紅色視圖我希望能夠動態改變其高度,導致黑色視圖相應地向上/向下移動,同時黃色視圖調整大小以適應紅色+黑色視圖。

對於黑色的看法,我已經添加了約束:

  • 將高度設置爲94
  • 引腳前端和後端空間的SuperView
  • 設置在頂部空間,紅色的看法51.
  • 集底部空間到黃色視圖在20

enter image description here

我想了解什麼看似神祕的約束條件需要添加,以便在紅色視圖垂直調整大小時,黑色視圖保持其距紅色視圖的當前距離並保持其大小,而外部容器視圖相應地調整大小,使其包含紅色視圖+黑色視圖+視圖之間的垂直間距。

對於紅色視圖,我添加了約束來將頂部,左側和右側的間距固定到超級視圖,但沒有運算出垂直約束。目前,我有一個約束高度= 114,優先級爲999,約束高度> = 114,優先級爲1000,這將確保視圖總是至少114高度...

enter image description here

當我嘗試手動設置紅色視圖的高度時,樂趣開始....我在視圖中添加了一個按鈕,當按下按鈕時,我手動設置紅色視圖的邊界。 (紅色視圖的默認高度爲114):

CGRect bounds = self.redView.bounds; 
bounds.size.height = 300; 
self.redView.bounds = bounds; 

當我運行這一點,並按下按鈕,在視圖去從這樣的:

enter image description here

要這樣:

enter image description here

對我來說這沒有任何意義。爲什麼會導致:

  • 紅色視圖的Y原點正在改變?特別是當有一個「必需」的限制,告訴它從黃色視圖的頂部停留20點。
  • 紅色和黑色視圖之間的間隔細分,儘管它們之間的間距約束是「必需的」?
  • 黃色視圖的垂直尺寸不變。同樣,儘管紅+黑之間的間隔,我已經嘗試了幾乎所有的組合,我可以想到的抗壓和內容擁抱優先........

我真的很想了解這一點,所以如果有人能夠解釋需要額外的常量限制/改變,但更重要的是爲什麼他們是必需的,因爲對我來說,佈局系統如何提供它的答案似乎並不清楚。

任何澄清非常讚賞。預先

感謝(以上所有代碼都在iOS 7上運行,並在Xcode 5.0.2構建)。

+0

所以總結一下。所有你的約束是靜態的/依賴的,除了紅色的視圖嗎?,你可以嘗試取消redview的高度限制嗎?當你按下按鈕時,你會這樣做:heightOfRedviewConstraints.constant = 100;我真的很想幫助你,但我現在不在我的xcode上。 hehehe – Bordz

回答

0

你不需要任何花哨的約束來做你想在這裏 - 沒有不平等或與優先事項搞亂。除了對邊的約束之外,紅色視圖應該有20到頂部,51到黑色視圖以及114的高度約束。黑色視圖有20到底部和94的高度。超級視圖(黃色)應該對頂部,左側和右側有零約束 - 沒有高度。你應該有一個IBOutlet來處理紅色視圖的高度限制。如果你想改變它的高度,修改其約束(不設置幀):

- (IBAction)resizeYellowView:(id)sender { 
    self.heightCon.constant = 300; 
} 

一切都從黃色觀點與固定值底部的頂部連接在一起,所以唯一能當紅色視圖的高度改變時改變,是黃色視圖的高度。

+0

謝謝!我不理解高度限制上的常量需要改變,而不是改變高度本身。儘管我仍然不完全明白爲什麼通過邊界設置高度不起作用,但在約束上設置常量確實可以做到這一點 –

+0

@JohnMartin,當您使用自動佈局時,您不應該設置框架。一切都應該通過約束來完成。話雖如此,我無法解釋你爲什麼得到了你所做的結果。 – rdelmar

+0

在自動佈局發生時,您在邊界和框架上執行的操作將在稍後由佈局引擎覆蓋。因此,在處理自動佈局時不應使用它們。 – nsuinteger

相關問題