以编程方式创建的动画 NSLayoutConstraint

Posted

技术标签:

【中文标题】以编程方式创建的动画 NSLayoutConstraint【英文标题】:Animate NSLayoutConstraint created programmatically 【发布时间】:2019-09-10 09:45:20 【问题描述】:

必须做一些特别的事情来为以编程方式实例化的约束设置动画?

我以编程方式将约束实例化为惰性变量:

private lazy var topConstraint: NSLayoutConstraint = 
    let constraint = view.topAnchor.constraint(equalTo: otherView.topAnchor, constant: otherView)
    return constraint
()

然后,我对这个约束的常数的变化进行动画处理:

topConstraint.constant = newValue
view.setNeedsLayout()
UIView.animate(withDuration: 1) 
    self.view.layoutIfNeeded()

它不起作用...我也尝试将常量设置放入块中:

UIView.animate(withDuration: 1) 
    self.topConstraint.constant = newValue
    self.view.setNeedsLayout()
    self.view.layoutIfNeeded()

但我一无所获,我尝试了几乎所有的组合。约束常量已正确更改,但始终没有动画。

PD:我也给了UIViewPropertyAnimator一个机会。

【问题讨论】:

How do I animate constraint changes?的可能重复 不,这个问题是问当约束由代码创建时是否有什么特别的事情要做...没有故事板。 首先,您设置constant: otherView ...应该是CGFloat,而不是对视图的引用。其次,你有没有设置过topConstraint.isActive = true 【参考方案1】:

不需要setNeedsLayout()

self.topConstraint.constant = 0.0
UIView.animate(withDuration: 1.0) [weak self] in
    self?.topConstraint.constant = 10.0 
    self?.view.layoutIfNeeded()

【讨论】:

我试过了,在这种情况下也不行。 先尝试设置一些硬编码值并检查是否有效。更新了答案。看看它现在是否有效。 不,我尝试了所有应该工作的东西......但是约束更改无法动画 在平移手势识别器的处理程序(选择器)内部。 让我们continue this discussion in chat。

以上是关于以编程方式创建的动画 NSLayoutConstraint的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity 中以编程方式创建动画?

如何以编程方式将视图的底部约束从安全区域更改为超级视图?

动画化以编程方式创建的 xaml 对象的翻译

如果约束是使用 VFL 以编程方式创建的,如何为约束更改设置动画?

如何以编程方式调整按钮动画的大小

以编程方式为循环加载动画的 UILabel 添加约束