UINavigationBar отображается под StatusBar - PullRequest
14 голосов
/ 20 ноября 2010

Я пытаюсь создать интерфейс, похожий на приложение «Фотографии», в котором строка состояния и панель навигации исчезают, но у меня возникла проблема. Если я коснусь, чтобы скрыть интерфейс, поверните устройство, затем коснитесь, чтобы восстановить его, после чего панель навигации переместится под строку состояния (см. Фото). Если я поверну устройство, панель навигации вернется на свое место. Как я могу это исправить?

alt text

Ответы [ 6 ]

32 голосов
/ 31 мая 2011

Это может быть немного поздно, но у меня ТОЧНО та же проблема.Я проектировал представление для чтения в полноэкранном режиме с прозрачной строкой состояния, панелью навигации и панелью инструментов, которые можно плавно увеличивать и уменьшать, нажимая в центре экрана.

Мне удалось это исправить.очень просто, в основном суть проблемы, если это: когда вы поворачиваете представление и 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 пересчитывает свою позицию.Я не знаю, является ли это лучшей реализацией для решения этой проблемы, но пока этот метод работает и не создает мерцания на экране и очень плавный.

Я надеюсь, что кто-то еще с моей проблемой может споткнутьсяна этот пост и найти это простое решение этой проблемы.

3 голосов
/ 02 июля 2012

Другое (более простое) решение - сбросить рамку представления верхнего уровня при повторном отображении строки состояния; например,

- (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];
}
1 голос
/ 23 июля 2013

У меня были проблемы с установкой альфа = 0 для панели навигации, чтобы скрыть его. Итак, видимо, после звонка:

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];

Вы можете удалить панель навигации, вызвав скрытый и повторно вставив его в представление, а затем установив альфа = 0:

//hiding and showing to redraw navigationBar over the status bar
self.navigationController.navigationBarHidden = YES;
self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.alpha = 0;

Это решит дополнительное пространство, которое занимала строка состояния.

1 голос
/ 20 ноября 2010

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

Лучше всего вручную изменить размер представления, чтобы при повторном появлении строки состояния вы также урезали представление, чтобы оно правильно расположилось ниже строки состояния.

0 голосов
/ 12 сентября 2013

Исправлена ​​эта проблема:

    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];

    self.navigationController.navigationBarHidden = YES;
    self.navigationController.navigationBarHidden = NO;
0 голосов
/ 14 ноября 2012
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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...