2014-09-03 78 views
131

我有一個UITextField,我想在放大時擴大它的寬度。我設置了約束條件,並確保左邊的約束具有較低的優先級,然後是我試圖在右邊進行動畫處理的約束。試圖在動畫中制約動畫約束

這是我正在嘗試使用的代碼。

// move the input box 
    UIView.animateWithDuration(10.5, animations: { 
     self.nameInputConstraint.constant = 8 
     }, completion: { 
      (value: Bool) in 
      println(">>> move const") 
    }) 

這有效,但它似乎只是立即發生,似乎沒有任何運動。我試圖將它設置爲10秒以確保我沒有錯過任何東西,但我得到了相同的結果。

nameInputConstraint是我控制從IB連接到我的班級的約束的名稱。

感謝您的幫助提前!

+1

可能重複[我怎樣動畫約束的變化?(http://stackoverflow.com/questions/12622424/how-do-i-animate-constraint-changes) – 2015-09-20 16:33:53

回答

398

您需要先更改約束,然後爲更新設置動畫。

self.nameInputConstraint.constant = 8 
UIView.animateWithDuration(0.5) { 
    self.view.layoutIfNeeded() 
} 

而且在斯威夫特3.0:

UIView.animate(withDuration: 0.5) { 
    self.view.layoutIfNeeded() 
} 
+0

有人能解釋如何/爲什麼這有用嗎?在任何UIView上調用animationWithDuration都會動畫從UIView繼承的任何類並更改物理值? – nipponese 2016-03-07 00:53:18

+2

您提到的動畫API用於爲視圖和圖層的*屬性*設置動畫。在這裏我們需要動畫布局*中的*改變。這就是改變佈局約束的常量所要求的 - 單獨改變常量什麼也不做。 – Mundi 2016-03-07 00:57:54

+0

感謝@ryan,用Swift 3.0來完成這個答案。 – Mundi 2016-10-10 20:54:41

1

在我而言,我只更新了自定義視圖。

// DO NOT LIKE THIS 
customView.layoutIfNeeded() // Change to view.layoutIfNeeded() 
UIView.animate(withDuration: 0.5) { 
    customViewConstraint.constant = 100.0 
    customView.layoutIfNeeded() // Change to view.layoutIfNeeded() 
}