UINavigationBar появляется под StatusBar
Я пытаюсь сделать интерфейс похожим на приложение "Фотографии", в котором строка состояния и панель навигации исчезают в/из, но я столкнулся с проблемой. Если я коснусь экрана, затем поверните устройство, а затем нажмите, чтобы вернуть его, затем панель навигации переместится под строку состояния (см. Фото). Если я затем повернул устройство, навигационная панель вернется в нужное место. Как я могу это исправить?
![alt text]()
Ответы
Ответ 1
Это может немного запоздать, но у меня была ТОЧНАЯ проблема. Я рассматривал просмотр в полноэкранном режиме с прозрачной панелью состояния, навигационной панелью и панелью инструментов, которую вы могли бы затухать и выходить, нажав в центре экрана.
Способ, которым я смог его исправить, действительно прост, в основном ядро проблемы, если это:
Когда вы поворачиваете представление, а NavigationController пересчитывает новую позицию, он считает, что он должен быть в верхней части окна, потому что строка состояния скрыта. Когда после этого вы показываете как строку состояния, так и навигационную панель, они перекрываются.
Способы исправить это очень просто, просто держите BOOL, чтобы помнить, отображается ли ваше оверлей или скрыто, и реализуйте как willRotateToInterfaceOrientation, так и willAnimateRotationToInterfaceOrientation в вашем ViewController.
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (!isOverlayShowing)
{
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (!isOverlayShowing)
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
Быстро отображая и скрывая StatusBar в этих двух методах, StatusBar отображается в тот момент, когда NavigationBar пересчитывает свою позицию. Я не знаю, является ли это наилучшим вариантом для решения этой проблемы, но пока этот метод работает и не создает никаких мерцаний на экране и очень плавный.
Я надеюсь, что кто-то другой с моей проблемой может наткнуться на этот пост и найти это легкое решение этой проблемы.
Ответ 2
Другим (более простым) решением является reset рама представления верхнего уровня при повторном отображении строки состояния; например.
- (void)exitFullScreenMode
{
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
// work-around for navigation bar appearing under status bar - must be called before -setNavigationBarHidden:
self.view.window.rootViewController.view.frame = [UIScreen mainScreen].applicationFrame;
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
Ответ 3
К сожалению, это немного раздражает. При скрытии строки состояния она в основном открывает это пространство для использования uiviewcontrollers. При автосохранении он будет в основном перемещаться в это пространство, потому что он не знает, что вы захотите снова использовать это пространство.
Лучше всего вручную изменить размер представления, так что, когда строка состояния снова появится, вы также протрите представление вниз так, чтобы оно было правильно расположено ниже строки состояния.
Ответ 4
У меня были проблемы с настройкой альфа = 0 для того, чтобы navigationBar спрятал его. По-видимому, после вызова:
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
Вы можете удалить navigationBar, вызвав скрытый и повторно вставив его в представление, а затем установив альфа = 0:
//hiding and showing to redraw navigationBar over the status bar
self.navigationController.navigationBarHidden = YES;
self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.alpha = 0;
Это позволит решить дополнительное пространство, которое занимала строка состояния.
Ответ 5
if ( self.navigationController.navigationBarHidden )
{
/******* Cancel Fullscreen ****/
if ( UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad )
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
[self.navigationController setNavigationBarHidden:NO animated:YES];
[self.navigationController setToolbarHidden:NO animated:YES];
}
else {
/******* Enable Fullscreen ****/
if ( UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad )
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
[self.navigationController setNavigationBarHidden:YES animated:YES];
[self.navigationController setToolbarHidden:YES animated:YES];
}
Ответ 6
Исправлена ошибка:
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
self.navigationController.navigationBarHidden = YES;
self.navigationController.navigationBarHidden = NO;