以编程方式修改autolayout约束时查看不更新

时间:2014-05-30 20:29:48

标签: ios cocoa-touch autolayout

在修改第二个约束(第一个正常工作)后,我无法正确显示自己的视图。我正在修改一个约束,动画它,然后修改完成块中的另一个约束(没有动画)。

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

问题是无论我尝试什么,第二个约束变化都没有生效。

以下是我正在尝试的内容(请注意问题仅在toolbarVisibleYES时,因为我在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始终处于相反的位置),就好像第二个约束修改在下一个动画之前不会生效。

同样,如果我将另一个视图推送到导航控制器(嵌入在containerView中),则布局会自行更正。这就好像是因为某种原因而忽略了我的命令再次出现。

实际上我只是注意到,即使我最初进行第二次更改并完全跳过完成块,在所有情况下似乎都没有动画第二个约束更改。有点可疑。

更新:我正在使用dispatch_after错误地认为它接受了NSTimeInterval。在给它一个正确的dispatch_time_t并将其放入完成块后,布局现在有时更新。然而,它非常片状,这似乎非常hackish所以我觉得我好像缺少了什么。如果有人对此有更多了解,请赐教,我会给你答案。

更新2:我决定尝试在viewDidLayoutSubviews中记录我要更改的元素的高度。有趣的是,它被调用两次,首先是前一个值,第二个是正确调整的高度。所以我猜它至少部分正确地铺设了东西,但由于某种原因,容器内的tableView仍然没有正确调整自身大小。我不确定我错过了什么。

1 个答案:

答案 0 :(得分:0)

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

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

我还要确保您已正确连接约束并且toolbarVisible为真。