2010-11-20 22 views
14

Próbuję utworzyć interfejs podobny do aplikacji Photos, w której pasek stanu będzie się pojawiał/znikał, ale mam problem. Jeśli stuknę, aby ukryć interfejs, obróć urządzenie, a następnie dotknij, aby je przywrócić, a następnie pasek nawigacji zostanie przestawiony pod paskiem stanu (patrz zdjęcie). Jeśli następnie obrócę urządzenie, pasek nawigacji wróci do właściwego miejsca. Jak mogę to naprawić?UINavigationBar pojawia się pod paskiem stanu

alt text

Odpowiedz

32

Może się to wydać trochę późno, ale miałem dokładnie ten sam problem. Wyznaczałem widok czytelnika na pełnym ekranie z przezroczystym paskiem stanu, paskiem nawigacyjnym i paskiem narzędzi, które można było znikać i wchodzić, dotykając środka ekranu.

Sposób, w jaki udało mi się to naprawić, jest naprawdę prosty, zasadniczo stanowi sedno problemu, jeśli: Po obróceniu widoku i NavigationController ponownie oblicza swoją nową pozycję, uważa, że ​​powinien znajdować się w górnej części okna ponieważ pasek stanu jest ukryty. Po wyświetleniu zarówno paska stanu, jak i paska nawigacji, nakładają się one.

Sposób na naprawienie tego jest naprawdę łatwy, wystarczy zachować BOOL, aby zapamiętać, czy nakładka jest pokazana lub ukryta, i wdrożyć zarówno willRotateToInterfaceOrientation i willAnimateRotationToInterfaceOrientation w swoim 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]; 
} 

przez szybkiego wskazywania i ukrywanie StatusBar w obu sposobach StatusBar przedstawiono dokładnie w momencie NavigationBar ponownie oblicza swoją pozycję. Nie wiem, czy to najlepsza implementacja, aby rozwiązać ten problem, ale jak dotąd ta metoda działa i nie powoduje migotania na ekranie i jest bardzo płynna.

Mam nadzieję, że ktoś inny z moim problemem może natknąć się na to stanowisko i znaleźć to łatwe rozwiązanie tego problemu.

+8

Dziękuję.To doprowadzało mnie do szału. – bdmontz

+3

Wow, łał. To jest rozwiązanie, którego szukałem! Mój problem polegał na tym, że jeśli użytkownik zamknął aplikację, obrócił urządzenie i ponownie je uruchomił, uzyskałbym nałożony pasek stanu. Nie przyszło mi nawet do głowy, że być może obroty zostały wystrzelone z podpowiedzi o ponownym uruchomieniu. To rozwiązuje to! – Shizam

+1

Ty, dobry Panie, jesteś dżentelmenem, uczonym i rycerzem. –

1

Niestety, to trochę denerwujące. Ukrywając pasek stanu, otwiera on w zasadzie to miejsce, z którego mogą korzystać kontrolery uiview. Po włączeniu autoregulacji, w zasadzie wprowadzi się w tę przestrzeń, ponieważ nie ma pojęcia, że ​​będziesz chciał ponownie użyć tej przestrzeni.

Najlepiej jest ręcznie zmienić rozmiar widoku, aby po ponownym wyświetleniu paska stanu można również zgnieść widok w dół, tak aby był poprawnie umieszczony pod paskiem stanu.

3

Innym (prostszym) rozwiązaniem jest resetowanie ramki widoku najwyższego poziomu po ponownym wyświetleniu paska stanu; na przykład

- (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]; 
} 
0
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]; 
} 
1

miałem problemy ustawień alfa = 0 do navigationBar aby go schować. Więc jak widać, po wywołaniu:

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

można usunąć navigationBar wywołując ukryty i ponowne włożenie go do widoku, a następnie ustawiając alfa = 0:

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

to rozwiąże dodatkowa miejsce, w którym znajdował się pasek stanu.

0

Poprawiono ten problem poprzez:

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

    self.navigationController.navigationBarHidden = YES; 
    self.navigationController.navigationBarHidden = NO; 
Powiązane problemy