如何在 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 设置动画?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中为以下观察删除 GeoFire 句柄?

如何在 Swift 中为 UIBarButtonItem 设置动作

如何在 Swift 中为 UIImage 着色?

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

如何在 swift 中为 iOS 全局添加 HTTP 标头

如何在 Swift 中为 NSObject 模型变量添加值?