2015-09-01 16 views
7

Po utworzeniu niestandardowego interfejsu użytkownika w systemie iOS9 okno staje się widoczne na ekranie, ale pasek stanu nagle znika.iOS9: Niestandardowy interfejs użytkownika UIWindow powoduje zniknięcie paska stanu

Po ukryciu okna pasek stanu pojawia się ponownie.

Poniżej 2 zrzuty ekranu z tego, co otrzymuję na iOS9 z beta5 beta5.

Pasek stanu, gdy okno zwyczaj jest ukryta: Status bar while the custom window is hidden

Pasek stanu, gdy okno zwyczaj jest widoczny: (. Całość porusza się do góry ekranu) Status bar while the custom window is visible

Jest to kod I Używałem (który działał dobrze na iOS8):

#define DEBUG_SHOWENV_HEIGHT 20.0f 

@interface AppDelegate() 
@property (nonatomic) UIWindow*  envWindow; 
@end 

-(UIWindow*)envWindow 
{ 
    if (_envWindow == nil) 
    { 
     // Create the window 
     _envWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0.0f, self.window.frame.size.height, self.window.frame.size.width, DEBUG_SHOWENV_HEIGHT)]; 
     _envWindow.rootViewController = [[UIViewController alloc] init]; // added since iOS9 to avoid the assertion 
     _envWindow.userInteractionEnabled = NO; 
     _envWindow.windowLevel = UIWindowLevelStatusBar; 
     _envWindow.backgroundColor = [UIColor colorWithRed:0.243 green:0.471 blue:0.992 alpha:0.8]; 

     // Make a label 
     UILabel* labelEnv = [[UILabel alloc] initWithFrame:CGRectMake(8.0f, 0.0f, _envWindow.bounds.size.width - 16.0f, DEBUG_SHOWENV_HEIGHT)]; 
     labelEnv.font = [UIFont boldSystemFontOfSize:12.0f]; 
     labelEnv.textColor = [UIColor whiteColor]; 
     labelEnv.text = @"DEVELOP ENVIRONMENT"; 
     [_envWindow addSubview:labelEnv]; 
    } 
    return _envWindow; 
} 

// ==== in applicationDidBecomeActive 

// Show the window 2 seconds then hide it. 
[self.envWindow.layer removeAllAnimations]; 
self.envWindow.frame = CGRectMake(0.0f, self.window.frame.size.height, self.window.frame.size.width, DEBUG_SHOWENV_HEIGHT); 
self.envWindow.hidden = NO; 
[UIView animateWithDuration:0.25f 
         delay:0.0f 
        options:UIViewAnimationOptionCurveEaseOut 
       animations:^{ 
        self.envWindow.frame = CGRectMake(0.0f, self.window.frame.size.height - DEBUG_SHOWENV_HEIGHT, self.window.frame.size.width, DEBUG_SHOWENV_HEIGHT); 
       } 
       completion:^(BOOL finished) { 

        if (finished) 
        { 
         [UIView animateWithDuration:0.25f 
               delay:2.0f 
              options:UIViewAnimationOptionCurveEaseOut 
              animations:^{ 
               self.envWindow.frame = CGRectMake(0.0f, self.window.frame.size.height, self.window.frame.size.width, DEBUG_SHOWENV_HEIGHT); 
              } 
              completion:^(BOOL finished) { 

               if (finished) 
               { 
                self.envWindow.hidden = YES; 
               } 
              }]; 
        } 
       }]; 

Byłbym wdzięczny za każdą pomoc.

+0

Dlaczego masz niestandardowe okno, a nie tylko 'UIViewController'? – NRitH

+0

Ponieważ chcę, aby była wyświetlana w dowolnym momencie, gdy aplikacja staje się aktywna (nawet podczas przejść itp.). –

Odpowiedz

4

Rozwiązany. Potrzebowałem do wdrożenia tej metody w kontrolerze widoku root:

- (BOOL)prefersStatusBarHidden 
{ 
    return NO; 
} 

z jakichś powodów, kontroler widoku głównego w tym UIWindow ukrył pasek stanu. (choć powinien on powrócić NO domyślnie normalnie)

Więc zamiast robić:

_envWindow.rootViewController = [[UIViewController alloc] init]; // added since iOS9 to avoid the assertion 

tworzę własny kontroler widok z prefersStatusBarHidden nadpisane.

0

Linia _envWindow.windowLevel = UIWindowLevelStatusBar; umieszcza okno na tym samym poziomie (zamawianie z), jak pasek stanu. Myślę, że to, czego chcesz, to UIWindowLevelNormal, aby pasek stanu pojawił się nad nim.

+0

Nie rozwiązałem problemu. Wydaje się, że nie jest to tylko kwestia porządku rysowania, ponieważ zawartość widoku przesuwa się do ekranu, gdy pasek stanu nie jest widoczny. –