2014-09-03 82 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() 
}