Ios 以编程方式修改自动布局约束时视图不更新

Ios 以编程方式修改自动布局约束时视图不更新,ios,cocoa-touch,autolayout,Ios,Cocoa Touch,Autolayout,在修改第二个约束(第一个约束可以正常工作)后,我很难让视图正确布局。我正在修改一个约束,设置其动画,然后在完成块中修改另一个约束(不带动画) 我这样做的原因是我不希望第二个约束更改影响动画,但我希望它在初始动画完成后立即生效 问题是第二个约束更改根本不起作用,不管我怎么做 以下是我正在尝试的内容(请注意,问题只出现在工具栏可见为是时,因为当它为否时,我会提前执行这两个动画): 上述方法发生在observeValueForKeyPath:…方法中。我曾尝试在块之后将上述所有代码包装在一个dispa

在修改第二个约束(第一个约束可以正常工作)后,我很难让视图正确布局。我正在修改一个约束,设置其动画,然后在完成块中修改另一个约束(不带动画)

我这样做的原因是我不希望第二个约束更改影响动画,但我希望它在初始动画完成后立即生效

问题是第二个约束更改根本不起作用,不管我怎么做

以下是我正在尝试的内容(请注意,问题只出现在
工具栏可见
时,因为当它为
时,我会提前执行这两个动画):

上述方法发生在
observeValueForKeyPath:…
方法中。我曾尝试在块之后将上述所有代码包装在一个
dispatch_中,但效果更糟糕,因为它总是落后一步(即containerView总是处于相反的位置,因为它应该是这样),好像第二个约束修改直到下一个动画才生效

类似地,如果我将另一个视图推到导航控制器上(它嵌入到containerView中),布局会自动更正。这就像是因为某种原因,它忽略了我再次展示自己的命令

事实上,我只是注意到,即使我最初进行了第二次更改,并完全跳过了完成块,但并不是在所有情况下都对第二次约束更改设置动画。有点可疑

更新:我在
错误地认为它接受了NSTimeInterval之后使用了
dispatch\u。在给它一个适当的
dispatch\u time\t
并将其放入完成块后,布局现在有时会更新。然而,它是非常脆弱的,这似乎是非常黑客,所以我觉得好像我错过了一些东西。如果有人知道更多,请告诉我,我会给你答案


更新2:我决定尝试在
viewdilayoutsubviews
中记录我试图更改的元素的高度。有趣的是,它会被调用两次,第一次调用前一个值,第二次调用正确调整的高度。所以我想它至少部分地正确地布局了一些东西,但是出于某种原因,containerView中的tableView仍然没有正确地调整自身的大小。我不确定我遗漏了什么。

我将首先设置一个断点,并确保在动画持续时间内您没有第二次命中动画代码。如果它位于observeValueForKeyPath中,则可能多次点击动画,从而导致不一致

您也不需要调用setNeedsUpdateConstraints或layoutifneed。设置常量应该足够了


我还要确保您已经正确地连接了约束,并且Toolbar Visible是真的。

我正在记录一些调试语句,以确保只在预期的时候调用一次。约束是正确连接的,因为更改最终会生效,但不会立即生效。例如,如果我旋转设备,它会突然正确渲染,包括如果我旋转回原始方向。
    if ( !toolbarVisible )
        self.containerViewBottomSpace.constant = toolbarVisible ? 60.f : 0;
    self.toolbarBottomSpace.constant = toolbarVisible ? 0 : 60.f; // this one works fine
    [self.view setNeedsUpdateConstraints];
    [UIView animateWithDuration:0.3f animations:^{
        [self.view layoutIfNeeded];
    } completion:^(BOOL finished) {
        if ( toolbarVisible )
            self.containerViewBottomSpace.constant = 60.f; // this one is not taking effect
        [self.view setNeedsUpdateConstraints];
        [self.view layoutIfNeeded];
    }];