自动布局约束以编程方式修改时,查看不更新

在修改第二个约束(第一个工作正常)后,我无法正确地将自己的视图放在正确的位置。 我正在修改一个约束,animation它,然后修改完成块中的另一个约束(没有animation)。

我这样做的理由是我不希望第二个约束更改影响animation,但我希望它立即生效,只要初始animation完成。

问题是第二个约束变化根本不起作用,不pipe我尝试什么。

这是我想要的(注意问题只在toolbarVisibleYES ,因为我在前面执行这两个animation的时候是NO ):

  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]; }]; 

上述方法发生在一个observeValueForKeyPath:...方法中。 我已经尝试将上面的代码包装在dispatch_after块中,但是这样做的效果会更糟糕,因为它始终落后一步(即containerView始终处于相反的位置),就好像第二个约束修改不是直到下一个animation才会生效。

同样,如果我将另一个视图拖到导航控制器(它embedded在containerView中),布局会自行修正。 就好像它只是无视我的命令,出于某种原因而重新出现。

其实我刚才注意到,即使我最初做了第二次改变,完全跳过了完成块,在所有情况下,似乎都没有使第二个约束改变动​​画化。 东西是可疑的。

更新:我正在使用dispatch_after错误地认为它接受了NSTimeInterval。 在给它一个适当的dispatch_time_t并把它放在完成块内后,布局现在有时会更新。 然而,这是非常片状,这似乎很hackish,所以我觉得好像我失去了一些东西。 如果有人对此有更多的了解,请赐教,我会给你答案。

更新2:我决定尝试logging元素的高度,我试图改变viewDidLayoutSubviews 。 有趣的是,它会被调用两次,第一次是以前的值,第二次是正确调整后的高度。 所以我想这是至less部分正确铺设东西,但由于某种原因,在containerView内的tableView仍然没有正确调整自身。 我不知道我错过了什么。

我首先断点,并确保在animation持续时间内没有再次点击animation代码。 如果它在observeValueForKeyPath中,您可能会多次点击animation,并导致一些不一致。

您也不应该调用setNeedsUpdateConstraints或layoutIfNeeded。 设定常数应该足够了。

我还要确保你已经正确地连接了约束,toolbarVisible是真的。