Рассмотрим контроллер вида, который должен выскочить (или скрыть) строку состояния при нажатии кнопки.
- (void) buttonClick:(id)sender
{
[[UIApplication sharedApplication] setStatusBarHidden:YES
withAnimation:UIStatusBarAnimationSlide];
}
Вышеописанное эффективно скрывает строку состояния, но не изменяет размер корневого представления соответствующим образом, оставляя 20-пиксельный зазор сверху.
Я ожидал, что корневой вид будет расширяться в пространстве, которое ранее использовалось в строке состояния (анимированное, с той же продолжительностью, что и анимация строки состояния).
Каков правильный способ сделать это?
(Я знаю, что есть много похожих вопросов, но я не мог найти ни одного скрытия строки состояния по требованию, а не скрывать его, чтобы отобразить новый контроллер представления)
Подход "грубой силы"
Очевидно, что следующие работы...
[[UIApplication sharedApplication] setStatusBarHidden:YES
withAnimation:UIStatusBarAnimationSlide];
[UIView animateWithDuration:0.25 animations:^{
CGRect frame = self.view.frame;
frame.origin.y -= 20;
frame.size.height += 20;
self.view.frame = frame;
}];
... но имеет недостатки:
- Жесткие коды: продолжительность анимации слайдов
- Жестко кодирует высоту строки состояния
- Начало корневого представления остается на (0, -20). Мне нравятся мои кадры для начала (0,0), когда это возможно.
Что я уже пробовал
- Убедитесь, что маска авторазрешения корневого представления имеет
UIViewAutoresizingFlexibleTopMargin
иUIViewAutoresizingFlexibleHeight
. - Вызывается
[self.view setNeedsLayout]
после скрытия строки состояния. - Вызывается
[self.view setNeedsDisplay]
после скрытия строки состояния. - Установите
wantsFullScreenLayout
вYES
до и после скрытия строки состояния.