Ограничение на основе макета не анимируется, когда высота строки состояния изменяется на iOS

У меня есть это представление, которое имело 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 запущен, но он не работает.

Ответ 1

Убедитесь, что вы добавили ограничения в метод updateConstraints.

Вот что docs говорят:

Пользовательские представления, которые сами устанавливают ограничения, должны сделать это, переопределив этот метод. Когда ваш пользовательский вид отмечает, что было внесено изменение в представление, которое делает недействительным одно из его ограничений, оно должно немедленно удалить это ограничение, а затем вызвать setNeedsUpdateConstraints, чтобы отметить, что ограничения необходимо обновить.