首页 文章

iOS上状态栏高度更改时,基于约束的布局未设置动画

提问于
浏览
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 . 但在这里,我不是创建动画块的人!那么有没有办法让变化动起来?

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

1 回答

  • 2

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

    这是docs所说的:

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

相关问题