2015-10-12 107 views
4

如何更改Storyboard中設置的約束?重寫iOS Storyboard約束

我想模仿Twitter的iOS個人資料頁面,其中標題縮小,當你向下滾動。

我有一個UIScrollView佔用整個視圖。然後我在UIScrollView中有一個UITableView。在故事板內,我必須爲UITableView設置一個固定的高度。所以有約束得出高度= 350

然後我試圖以編程方式改變它的高度:

tableView.frame = CGRectMake(0, 0, scrollView.frame.width, scrollView.frame.height - 30) 

當我做到這一點並沒有在所有影響的UITableView的大小。我假設這是因爲故事板的限制。

我錯過了什麼,或者我需要以編程方式做到這一點開始?

回答

9

不要與故事板中設置的約束作鬥爭。相反,您可以在文檔提綱視圖視圖和控件中找到它,以便從約束縮小到您的代碼中,從而創建@IBOutlet到高度限制。給它起一個名字,如tableHeightContraint

@IBOutlet weak var tableHeightConstraint: NSLayoutConstraint! 

然後,當你想改變UITableView的高度,修改約束的constant屬性:

tableHeightConstraint.constant = scrollView.frame.height - 30 

由於@BlackRider在評論中指出,有時需要觸發約束條件發生變化後的佈局。

呼叫:

view.layoutIfNeeded() 

會告訴自動佈局做,如果需要的應用約束。如果您正在爲變更製作動畫,則尤其如此。在這種情況下,layoutIfNeeded()調用在動畫塊內進行。

UIView.animateWithDuration(2) { 
    self.view.layoutIfNeeded() 
} 
+1

很好的答案。另外,有時在更改約束後需要強制佈局。例如:'view.layoutIfNeeded()'。如果您正在爲約束更改制作動畫,這一點尤其重要。在這種情況下,需要在動畫塊中調用'layoutIfNeeded'。 – Macondo2Seattle