2013-07-31 21 views
1

我看着http://developer.apple.com/library/ios/#recipes/xcode_help-interface_builder/articles/UnderstandingAutolayout.html,但解釋很模糊。如何讓自動佈局在Xcode中工作

我在iOS 6.我有兩個孩子的意見,一個在另一個頂部視圖控制器:

viewcontroller layout

我想用自動版式建立在這樣的方式的觀點,即如果我以編程方式更改頂視圖的框架,底視圖將調整大小以適應頂視圖的新框架。也就是說,如果我增加頂視圖的高度,底視圖的高度應該增加以保持兩個視圖之間的相同分隔;如果我減少頂視圖的高度,則會發生相反的情況。

默認的限制,我得到在Xcode中這兩種觀點是:

tableview constraints

mapview constraints

如果我按住Command和調整頂部(圖)來看,底部(的tableview)似乎正確縮小或垂直擴展以履行它們之間的空間約束。

然而,分鐘我嘗試通過代碼修改的頂視圖的框架或邊界內,例如:

self.topView.frame = CGRectMake(0, 0, 320, 514); 

仰視圖不收縮。 那麼我錯過了什麼?

回答

4

你不能修改self.topView.frame這樣的。設置框架是自動佈局的工作。您需要修改約束,然後讓自動佈局更新框架。

在視圖控制器創建NSLayoutConstraint類型的出口:

@property (nonatomic, strong) IBOutlet NSLayoutConstraint *topViewHeightConstraint; 

出口連接到高度= 127約束在你的故事板的頂視圖。 See this answer如果您需要更多幫助將插座連接到約束。

然後,改變俯視的高度,並具有自動佈局更新及仰視圖的框架也設置約束的常數:

self.topViewHeightConstraint.constant = 514; 

在運行循環結束(不正​​確但在屏幕更新之前),自動佈局將修改兩個視圖的幀以滿足更改的約束。

+0

好吧,我明白了。我認爲他們是以另一種方式工作的:改變框架引發約束的變化。謝謝!最後一件事,如果你願意,我可以創建一個單獨的問題,但是,我嘗試在'UIView animateWithDuration:...'調用中包裝'NSLayoutConstraint.constant'值更改,希望動畫調整大小,但它沒有動畫。我現在正要直接嘗試CoreAnimation,但想知道如果你知道它甚至有可能嗎? – SaldaVonSchwartz

+0

您需要強制UIKit在動畫塊內執行佈局傳遞。您可以在塊內部執行'[self.topView layoutIfNeeded]',或者如果您將完整的動畫方法與選項一起使用,則可以傳遞'UIViewAnimationOptionLayoutSubviews'標誌。 –

+0

+1提到從xib到代碼的約束映射 – SNR