2017-09-16 46 views
6

Od czasu iOS 11 pasek stanu w mojej aplikacji źle działa, gdy go odrzucam. Tło paska stanu zmienia się, gdy pasek statusu jest zwalniany. To nie to zrobić w iOS 10.Tło paska stanu znika podczas ukrywania w systemie iOS 11

status bar bug

Mam odtworzono problem w bardzo prosty aplikacji, który został przesłany na Github: TestStatusBarBug. Oto wszystkie z odpowiednim kodem:

AppDelegate.m

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [[UINavigationBar appearance] setBarTintColor:[UIColor grayColor]]; 
    return YES; 
} 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() { 
    BOOL _statusBarHidden; 
} 

@end 

@implementation ViewController 

-(BOOL)prefersStatusBarHidden 
{ 
    return _statusBarHidden; 
} 

-(UIStatusBarAnimation)preferredStatusBarUpdateAnimation 
{ 
    return UIStatusBarAnimationSlide; 
} 

- (IBAction)toggleStatusBar { 
    _statusBarHidden = !_statusBarHidden; 

    [UIView animateWithDuration:0.35 animations:^{ 
     [self setNeedsStatusBarAppearanceUpdate]; 
    }]; 
} 

@end 

Czy ktoś doświadczył tego problemu? Czy istnieje poprawka lub obejście?

Odpowiedz

4

Spojrzałem na projekt i zmieniając kolory widoku, udało mi się ustalić, że biały kolor, który widzisz, pochodzi z widoku z przyciskiem (jest to kolor tła).

Kiedy ukrywasz pasek stanu, pasek nawigacyjny wciąż znajduje się w starej lokalizacji (teraz jest za niski o 20 pikseli), więc widać białe tło widoku. Następnie pasek nawigacyjny rozsuwa się/przesuwa w górę, a biały znika.

Dlaczego to zachowanie zmieniło się w iOS 11, nie mogę powiedzieć, ale nie jest niczym niezwykłym, że mechanizmy ukrytych operacji zmieniają się podczas ważnej aktualizacji systemu iOS. Na szczęście istnieje proste rozwiązanie.

Po wykonaniu animacji zmiany widoczności paska stanu, zmuś również pasek nawigacji do układu. To spowoduje, że będzie poprawnie ustawione i animacja będzie wyglądać poprawnie.

Po prostu dodaj te dwie ostatnie linie do wytyczenia paska nawigacyjnego na kod przełączania.

- (IBAction)toggleStatusBar { 
    _statusBarHidden = !_statusBarHidden; 

    [UIView animateWithDuration:0.35 animations:^{ 
     [self setNeedsStatusBarAppearanceUpdate]; 
     [self.navigationController.navigationBar setNeedsLayout]; 
     [self.navigationController.navigationBar layoutIfNeeded]; 
    }]; 
} 

+0

Fantastic! Właśnie tego szukałem, dzięki! –

+0

Dzięki! To też działa dla mnie :) – Grubas