2015-09-01 4 views
7

Когда я создаю пользовательский интерфейс UIWindow в iOS9, окно становится видимым на экране, но строка состояния внезапно исчезает.iOS9: Пользовательский интерфейс UIWindow отключает отображение состояния

Когда окно становится скрытым, строка состояния появляется снова.

Ниже 2 скриншота из того, что я получаю на iOS9 с Xcode7 beta5.

Строка состояния в то время как пользовательские окна скрыты: Status bar while the custom window is hidden

Строка состояния в то время как пользовательские окна видно: (. Весь экран перемещается к вершине) Status bar while the custom window is visible

Это код, который я (который хорошо работал на 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; 
               } 
              }]; 
        } 
       }]; 

Буду признателен за любую помощь.

+0

Почему у вас есть пользовательское окно, а не только 'UIViewController'? – NRitH

+0

Поскольку я хочу, чтобы он отображался в любое время, когда приложение становится активным (даже во время переходов и т. Д.) –

ответ

4

Решено. мне нужно реализовать этот метод в контроллере представления корня:

- (BOOL)prefersStatusBarHidden 
{ 
    return NO; 
} 

По некоторым причинам, контроллер зрения корня в этом UIWindow спрятал строку состояния. (хотя он должен возвращать NO по умолчанию, как правило)

Так вместо того, чтобы делать:

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

Я создал свой собственный контроллер представления с prefersStatusBarHidden преодолено.

0

Строка _envWindow.windowLevel = UIWindowLevelStatusBar; помещает ваше окно на том же уровне (z-ordering) в качестве строки состояния. Я думаю, что вы хотите UIWindowLevelNormal, так что над ним появляется строка состояния.

+0

Не удалось решить мою проблему. Похоже, что это не просто проблема с ордером, так как содержимое представления переключается на верх экрана, когда строки состояния нет. –

Смежные вопросы