使用 Swift 动画约束更改(第二项)?

Posted

技术标签:

【中文标题】使用 Swift 动画约束更改(第二项)?【英文标题】:Animating a constraint change (second item) using Swift? 【发布时间】:2015-08-04 16:38:38 【问题描述】:

我在 IB 中定义了一个约束,如下所示。如何以编程方式动画将此约束中的“第二项”更改为不同的对象(有效地将第一项移动到屏幕上)。

这是我尝试过的代码 - 其中“categoryTableViewTop”是 NSLayoutConstraint。我收到错误“无法分配给此表达式的结果”。

func expandCategory(button: UIButton) 
    tableView2.animateWithDuration(0.5, animations: 
       categoryTableViewTop.secondItem = categoryHeader.top
    )

【问题讨论】:

【参考方案1】:

您没有更改代码中的约束常量。你必须像这样改变它:

categoryTableViewTop.secondItem.constant = categoryHeader.top.constant

我假设 secondItemtop 是来自约束的 IBOutlets

要为约束更改设置动画,您必须像这样:

self.view.layoutIfNeeded()
UIView.animateWithDuration(5, animations:  _ in
        // change your constraints here
        myTopConstraint.constant = 50.0
        self.view.layoutIfNeeded()
    , completion: nil)

欲了解更多信息,请阅读this answer 或此guide from the docs。

【讨论】:

谢谢,但我不想更改约束常量,我想更改约束项/对象。所以 categoryTableViewTop 是一个来自约束的 IBOutlet。 如果您想在屏幕上移动某些内容,正如您在问题中所说,您将必须更新约束常量值。您不能只是将一个出口分配给另一个出口并希望获得相同的结果。约束是计算出来的,这就是为什么你必须分配计算值而不是对象本身。【参考方案2】:

约束不允许您更改代码中的 secondItem,因为它是只读属性。

我还没有尝试过动画,但是对于其他动态布局,可以在界面生成器中使用不同的 secondItems 创建两个不同的约束,并在代码中更改它们的优先级。如果相同的方法适用于动画,您可以尝试。

使用优先级 750 和 250,因为这些约束被视为可选项。

【讨论】:

"使用优先级 750 和 250,因为这些约束被视为可选项。"是正确的解决方案

以上是关于使用 Swift 动画约束更改(第二项)?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:动画后将 UIView 的帧重置为其约束

Objective-C:动画高度约束更改不起作用

使用 Swift 更新动画中的约束

设置 Lottie 动画的约束 - swift

使用 setNeedsLayout 动画约束更改

使用平移手势平滑地更改动画约束