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

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

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

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

【问题讨论】:

    标签: ios swift interface-builder uiviewanimation nslayoutconstraint


    【解决方案1】:

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

    categoryTableViewTop.secondItem.constant = categoryHeader.top.constant
    

    我假设 secondItem 和 top 是来自约束的 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,因为这些约束被视为可选项。"是正确的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多