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

How do I animate a NSLayoutConstraint in Swift?

我想为 UIImageView 设置动画。我在 viewDidLoad 中声明了一个 NSLayoutConstraint 并使用了这个代码:

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

为什么我的图像不动?

当您点击 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().

的调用设置为动画

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

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