如何在 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 设置动作