-(void)updateConstraints 中的动画约束更改

Posted

技术标签:

【中文标题】-(void)updateConstraints 中的动画约束更改【英文标题】:Animating Constraint Changes in -(void)updateConstraints 【发布时间】:2015-02-25 21:49:42 【问题描述】:

我已经阅读了许多问题,这些问题表明为了动画约束更改,我们只需要...

self.someConstraint.constant = 0.f;
[UIView animateWithDuration:0.5f animations:^
    [self layoutIfNeeded];
];

最近,我读到自定义视图子类应该在 UIView 上使用-(void)updateConstraints 方法来执行约束更新,以防发生许多属性更改导致您在多个地方执行上述代码块,这将导致许多不需要的布局传递。

UIView -(void)updateConstraints documentation

我实际上很喜欢这种更新所有约束的方法。一些简单的代码...

- (void)updateConstraints

    if(someCondition)
    
         self.someConstraint.constant = 0.f;
    
    //Maybe some other conditions or constant changes go 
    here based on the current state of your view.
    [super updateConstraints];

此时,我原来的约束动画代码现在只变成了

[self setNeedsUpdateConstraints];

唯一的问题是我现在失去了对这些变化进行动画处理的能力。 我查看了视图文档以找到一种方法来对约束的这些更改进行动画处理,但我似乎找不到合适的方法来覆盖以在动画块中调用 [self layoutIfNeeded]。即使在这种情况下,我觉得应该没有必要调用它,因为将要执行布局,而且我觉得我不应该在当时和那里强制它。

有谁知道如何使这些约束更改变为动画?

【问题讨论】:

【参考方案1】:

您需要致电[self updateConstraintsIfNeeded]。所以你的代码看起来像这样......

[self updateConstraintsIfNeeded];
[UIView animateWithDuration:0.25 animations:^
    [self layoutIfNeeded];
];

【讨论】:

以上是关于-(void)updateConstraints 中的动画约束更改的主要内容,如果未能解决你的问题,请参考以下文章

何时以及为何调用 updateConstraints?

UIStackView 间距在未设置 updateConstraints 时打破约束

自动布局:updateConstraints 不会在方向更改时得到调用

使用 masonry mas_updateConstraints 的 时候 需要注意的事项

mas_updateConstraints 没有移除 Masonry 中的约束

swift 不确定 layoutIfNeeded setNeedsUpdateConstraints 或 updateConstraints setNeedsLayout