2014-10-03 3 views
16

mam wiele kłopotów z nowym auto ukrywanie paska stanu w iOS 8.iOS 8 - Obrót sprawia StatusBar znikają nawet w trybie pionowym po przełączanie kontroli

W moim app, mam widok, w którym, gdy użytkownik kliknie raz, pasek nawigacyjny i pasek stanu znikną.

W krajobrazie pasek stanu ukrywa się samoczynnie i jest dla mnie w porządku. Potrzebuję go tylko w trybie portretu.

Problem polega na tym, że gdy urządzenie jest poziome, a pasek jest wyświetlany, gdy użytkownik stuknie dwa razy, aby przełączyć pasek (tak wyświetla się), i włącza urządzenie w trybie portretu, pasek stanu jest nadal ukryty.

Zasadniczo muszę być w stanie ukryć pasek stanu bez kolidować z jego naturalnego zachowania na iOS 8, więc podsumować scenariusz:

  • użytkownik wprowadza wspomniany pogląd o umieszczenie zakładek i NavigationBar i StatusBar;
  • Odgałęzniki raz w widoku i paski znikają
  • użytkownik obraca urządzenie, StatusBar nie pojawia - OK, chcę to
  • użytkownika kurki ponownie pokazać bary - StatusBar jeszcze ukryte, OK.
  • Użytkownik obraca się od pionu do portretu i ..
  • statusBar nadal ukryty - NIE OK.

MRW>http://rack.2.mshcdn.com/media/ZgkyMDEzLzA2LzEzL2Y0L1B1Y2suODkyZGIuZ2lmCnAJdGh1bWIJMTIwMHg5NjAwPg/c6538ddb/a38/Puck.gif

Próbowałem wyregulować StatusBar na willRotate, ale zrobiłem bałagan, w którym StatusBar byłby widoczny, gdy nie miała. Kod używam:

- (BOOL)prefersStatusBarHidden 
{ 
    return statusBarHidden; 
} 

-(void)toggleBars:(UITapGestureRecognizer *)gesture{ 
    CATransition *animation = [CATransition animation]; 
    animation.type = kCATransitionFromBottom; 
    animation.subtype = kCATransitionFromTop; 
    animation.duration = .2f; 
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]]; 


    BOOL toggleNavigationBar = self.navigationController.navigationBarHidden; 
    [self.navigationController.navigationBar.layer addAnimation:animation forKey:nil]; 
    [self.navigationController setNavigationBarHidden:!toggleNavigationBar animated:YES]; 



    BOOL toggleTabHidden = self.tabBarController.tabBar.hidden; 
    if(![[[NSUserDefaults standardUserDefaults] objectForKey:@"showTabBar"]isKindOfClass:[NSNull class]]){ 
     if([(NSNumber*)[[NSUserDefaults standardUserDefaults] objectForKey:@"showTabBar"]boolValue]) 
     { 
      [self.tabBarController.tabBar.layer addAnimation:animation forKey:nil]; 
      [self.tabBarController setHideTabBar:!toggleTabHidden animated:YES]; 
     } 
    } 

    statusBarHidden = [UIApplication sharedApplication].statusBarHidden; 
    [[UIApplication sharedApplication] setStatusBarHidden:!statusBarHidden withAnimation:UIStatusBarAnimationSlide]; 
    [self setNeedsStatusBarAppearanceUpdate]; 


    if (IS_IOS8){ 
     if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){ 
      if (statusBarHidden){ 
       [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
      } 
     } 
    } 

} 

Myślałam o ustawienie flagi w którym, gdy pasek stanu jest ukryty, gdy w krajobrazie i wszystkich kontroli są tam, na obrót to wywołać stanu. Bez powodzenia, najwyraźniej ..

Każda pomoc bardzo ceniona.

Odpowiedz

26

Czy używasz paska stanu opartego na UIViewController? Jeśli zaimplementujesz prefersStatusBarHidden, zakładam, że tak.

Teraz

[[UIApplication sharedApplication] setStatusBarHidden:!statusBarHidden withAnimation: UIStatusBarAnimationSlide]; 

nie ma pracować z UIViewController opartej wygląd paska stanu.

Wystarczy, że zwrócisz inną wartość z metody prefersStatusBarHidden i zadzwonisz pod numer setNeedsStatusBarAppearanceUpdate, aby powiadomić aplikację o zmianie wartości zwracanej.

więc zmienić na pasku stanu widoczności należy po prostu zrobić

@property (nonatomic, assign) BOOL hideStatusBar; 

- (BOOL)prefersStatusBarHidden 
{ 
    return self.hideStatusBar; 
} 

- (void)toggleBars:(UITapGestureRecognizer *)gesture 
{ 
    ... hide navbar and tabbar ... 

    self.hideStatusBar = ! self.hideStatusBar; 
    [self setNeedsStatusBarAppearanceUpdate]; 
} 

I to jest to!

+1

Dzięki za to! Wskazał mi właściwą drogę! Jedyne, co musiałem zrobić, to dodać kolejny bool, aby sprawdzić, czy orientacja powinna pokazywać statusBar. To działało jak czar! – Phillip

+0

Pamiętaj tylko, że działa to tylko z iOS7, dla starszych wersji [[UIApplication sharedApplication] setStatusBarHidden ...] musi być użyty. Miło, że mogłem pomóc! – hybridcattt

+0

Na szczęście muszę tylko obsługiwać iOS 7 i wyżej, więc wszystko jest w porządku! Dzięki jeszcze raz. – Phillip

0
#pragma mark After and Before Oriantation Change Methods+Delegate 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; 
} 

#pragma mark nav 

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    [[UIApplication sharedApplication] setStatusBarHidden:NO]; 
} 

Jest to metoda krótka i łatwa.

6

Ten pracował dla mnie:

- (void)viewWillLayoutSubviews { 
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; 
} 
+2

Próbowałem wszystkich rozwiązań, ale ten jest najlepszy dla mnie – Rikco

0

Jest to szybka (3.0) wersja tego prefersStatusBarHidden

override var prefersStatusBarHidden: Bool{ 
    return false 
} 

Wystarczy dodać go do ViewController

Powiązane problemy