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

Ces*_*are 14 ios nslayoutconstraint swift

我的目标是动画一个NSLayoutConstraint.我宣布viewDidLoadNSLayoutConstraint.在viewDidLoad,我用这个代码:

UIView.animate(withDuration: 1) {
    myConstraint.constant = 100
    self.view.layoutIfNeeded()
}
Run Code Online (Sandbox Code Playgroud)

为什么我的图像不移动?

Rob*_*Rob 38

到达时viewDidLoad,尚未应用约束引擎,并且尚未建立视图的起始位置.所以,随意添加原始约束viewDidLoad,但是你会想要推迟animateWithDuration到过程的后期(例如viewDidAppear).


例如,假设您在Interface Builder(IB)中添加了一些约束.您可以@IBOutlet通过control从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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Rup*_*tel 9

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

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