在修改第二个约束(第一个正常工作)后,我无法正确显示自己的视图。我正在修改一个约束,动画它,然后修改完成块中的另一个约束(没有动画)。
我这样做的原因是我不希望第二个约束更改影响动画,但我希望它在初始动画完成后立即生效。
问题是无论我尝试什么,第二个约束变化都没有生效。
以下是我正在尝试的内容(请注意问题仅在toolbarVisible
为YES
时,因为我在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仍然没有正确调整自身大小。我不确定我错过了什么。
答案 0 :(得分:0)
我首先断点并确保在动画持续时间内没有再次击中动画代码。如果它在observeValueForKeyPath中,你可以多次点击动画,这会导致一些不一致。
您也不需要调用setNeedsUpdateConstraints或layoutIfNeeded。设置常量应该足够了。
我还要确保您已正确连接约束并且toolbarVisible为真。