使用 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
我假设 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,因为这些约束被视为可选项。"是正确的解决方案以上是关于使用 Swift 动画约束更改(第二项)?的主要内容,如果未能解决你的问题,请参考以下文章