【问题标题】:Swift animation of constraint not working约束的快速动画不起作用
【发布时间】:2018-02-10 01:23:51
【问题描述】:

下面的函数只是将视图移动到一个新的地方。它没有显示动画:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIView.animate(withDuration: 0.9, animations: {
        //self.leadingConst.constant -= 200

        self.view.setNeedsLayout()
    })
}

【问题讨论】:

  • self.view.layoutIfNeeded() 是实际动画发生的时间。 setNeedsLayout() 只是告诉我在下一次传递中需要布局的视图,但实际上并没有这样做。

标签: swift animation uiview


【解决方案1】:

self.leadingConst.constant -= 200 应该在UIView.animate 之外,像这样:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.leadingConst.constant -= 200
    UIView.animate(withDuration: 0.9, animations: {
        self.view.setNeedsLayout()
    })
}

参考:trying to animate a constraint in swift

【讨论】:

  • 立即显示到 -200 位置.. 没有动画
【解决方案2】:

几周前我遇到了同样的问题。问题归结为几件事。我正在以编程方式混合添加视图并将它们添加到情节提要中,我没有调用 layoutSubviews(),而是将我的约束添加为 IBOutlets 作为弱变量。所以我建议只使用情节提要(否则动画会很快变得复杂)并使您的leadingConst 约束成为一个变量。您还应该在动画块中移动要设置动画的对象,然后使用完成块重置约束。

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

    view.layoutSubviews()
    UIView.animate(withDuration: 0.9, animations: {

        //something like this
        self.animatableObject.origin.x -= 200

    }, completion: {(finished: Bool) in

        self.leadingConst.constant -= 200

    })
}

我不确定您要制作什么动画,所以 origin.x 行只是一个示例。

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多