使用 Swift 更新动画中的约束
Posted
技术标签:
【中文标题】使用 Swift 更新动画中的约束【英文标题】:Updating constraints in animation with Swift 【发布时间】:2015-06-04 08:13:19 【问题描述】:我想要一个动画将 UIImageView 移动到由一组新约束定义的新位置,但由于某种原因,我无法让它工作。我正在尝试:
@IBOutlet weak var oldBottom: NSLayoutConstraint!
...
func animateMovement()
// Here I'm defining a new constraint
var newBottom = NSLayoutConstraint(
item: self.logo,
attribute: NSLayoutAttribute.Bottom,
relatedBy: NSLayoutRelation.Equal,
toItem: self.usernameField,
attribute: NSLayoutAttribute.Bottom,
multiplier: 1,
constant: 15)
self.view.layoutIfNeeded()
UIView.animateWithDuration(1.0, animations:
// Here I'm setting the already existing constraint (defined in storyboard) to the new constraint
self.oldBottom = newBottom
self.view.layoutIfNeeded()
, completion: )
【问题讨论】:
不要在动画块之外调用 layoutIfNeeded 【参考方案1】:您需要更新约束并为 layoutIfNeeded 设置动画,试试这个:
func animateMovement()
var newBottom = NSLayoutConstraint(
item: self.logo,
attribute: NSLayoutAttribute.Bottom,
relatedBy: NSLayoutRelation.Equal,
toItem: self.usernameField,
attribute: NSLayoutAttribute.Bottom,
multiplier: 1,
constant: 15)
self.view.layoutIfNeeded()
self.oldBottom = newBottom
UIView.animateWithDuration(1.0, animations:
self.view.layoutIfNeeded()
, completion: )
【讨论】:
我试过这样做,不幸的是它不起作用:-/ 约束是否在没有动画的情况下移动? 不,不是,但我发现了我的错误(请参阅问题中的更新):-)【参考方案2】:所以我发现它的错误是一个非常简单的错误。我没有调用self.view.setTranslatesAutoresizingMaskIntoConstraints(false),因为我认为故事板已经处理了(因为我在其中使用了自动布局)。我只是在更新约束之前添加了它。 感谢所有输入:-)
【讨论】:
以上是关于使用 Swift 更新动画中的约束的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中使用 layoutIfNeeded() 不为特定约束更改设置动画?
当使用动画块内函数的参数时,Swift 无法解析 UIView.animateWithDuration 中的 CurveEaseIn