如何在 Swift 中为 NSLayoutConstraint 设置动画?

Posted

技术标签:

【中文标题】如何在 Swift 中为 NSLayoutConstraint 设置动画?【英文标题】:How do I animate a NSLayoutConstraint in Swift? 【发布时间】:2015-02-04 18:46:45 【问题描述】:

我想为 UIImageView 制作动画。我在viewDidLoad 中声明了NSLayoutConstraint 并使用了以下代码:

UIView.animate(withDuration: 1) 
    myConstraint.constant = 100
    self.view.layoutIfNeeded()

为什么我的图片不动?

【问题讨论】:

按原样使用问题中的代码示例! 【参考方案1】:

当您点击viewDidLoad 时,尚未应用约束引擎,并且尚未确定视图的起始位置。因此,您可以随意在viewDidLoad 中添加原始约束,但您需要将animateWithDuration 推迟到该过程的后期(例如viewDidAppear)。


例如,假设您在 Interface Builder (IB) 中添加了一些约束。您可以通过 control@IBOutlet 引用添加到它 - 从 Interface Builder 左侧面板中的文档大纲中的约束拖动到助手编辑器:

既然您已经引用了该约束,您现在可以通过编程方式更改该约束的 constant 值(但同样,如果您想查看此动画,请在 viewDidAppear 中执行此操作,而不是在 viewDidLoad当视图出现时):

@IBOutlet weak var topConstraint: NSLayoutConstraint!

override func viewDidAppear(animated: Bool) 
    super.viewDidAppear(animated)

    topConstraint.constant = 100
    UIView.animate(withDuration: 2) 
        self.view.layoutIfNeeded()
    

对于以编程方式创建的约束,该过程是相同的。只需保存对约束的引用,然后在viewDidAppear 中更新constant,然后为layoutIfNeeded() 的调用设置动画。

【讨论】:

如果可能的话,请发布一些带有解释的代码...顺便感谢您的回复.. @iCrunCher - 查看修改后的答案。 有趣。我通常将 both 常量的新值的赋值 layoutIfNeeded() 的调用放在动画块内(我从这里的其他答案中得到它),它可以工作(当时当我们使用frame 为视图的位置设置动画时,我们也将它设置在动画块内 - 并且不需要layoutIfNeeded())。 我想知道为什么这也有效。 您只需要在动画块中使用layoutIfNeeded,因为这会强制自动布局引擎重新计算frame,这就是我们要制作动画的内容。话虽如此,像你一样,我也倾向于将约束的修改放在那个块中,因为我认为这使得动画的功能意图更加清晰,恕我直言。但是在这个例子中,我将约束的改变留在了动画块之外,以便从技术上清楚地说明需要对改变约束的结果进行动画处理。 swift 3 -> UIView.animate(withDuration: 0.5) self.view.layoutIfNeeded() 【参考方案2】:

请在 viewDidAppear 中设置约束并尝试以下更正

myConstant = 100
myConstraint.constant = myConstant
UIView.animateWithDuration(1, animations: 
self.view.layoutIfNeeded()
, completion: finished in )

【讨论】:

以上是关于如何在 Swift 中为 NSLayoutConstraint 设置动画?的主要内容,如果未能解决你的问题,请参考以下文章