11

我有这个曾经的看法autoresizingMask = UIViewAutoresizingFlexibleHeight

当状态栏会为其高度设置动画时(例如挂断电话时),视图的高度会设置动画并增加。

但是通过自动布局,我用约束替换了这个 autoresizingMask:

UIView *orangeView = [[UIView alloc] initWithFrame:CGRectZero];
orangeView.translatesAutoresizingMaskIntoConstraints = NO;
orangeView.backgroundColor = [UIColor orangeColor];

[self.view addSubview:orangeView];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[orangeView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(orangeView)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(40)-[orangeView]-(190)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(orangeView)]];

但是现在,我的布局变化并没有使用状态栏进行动画处理,它只是在没有任何动画的情况下进行了更改。

现在我知道在使用基于约束的布局时应该在动画块中调用 -layoutIfNeeded。但在这里我不是创建动画块的人!那么有没有办法让变化动起来呢?

这是否意味着我必须在我的代码中找到一个在我没有启动的动画块期间执行的位置?触发时,我尝试在控制器中设置 [self.view layoutIfNeeded] UIApplicationWillChangeStatusBarFrameNotification,但它不起作用。

4

1 回答 1

2

确保在updateConstraints方法中添加约束。

这是文档所说的:

自己设置约束的自定义视图应该通过覆盖此方法来实现。当您的自定义视图注意到对视图进行的更改使其其中一个约束无效时,它应该立即删除该约束,然后调用 setNeedsUpdateConstraints 以注意需要更新约束。

于 2013-03-22T17:59:16.123 回答