prefersStatusBarHidden и Черная полоса в окне после фонового использования приложения только для iPhone на iPad iOS 8

При запуске моего приложения только для iPhone на iPad с iOS 8 у меня в окне приложения появлялась черная полоса. Я могу воспроизвести его надежно, установив приложение в фоновом режиме в альбомной ориентации, а затем повторно открыв ее в портретной ориентации. На айфоне все нормально.

Чтобы попытаться устранить некоторые дополнительные факторы, я заменил исходный контроллер представления в моей раскадровке новым файлом контроллера представления xcode по умолчанию. Черная полоса остается на моем пустом белом окне.

Когда приложение работает "нормально", окно выглядит как заполненное серой областью вверху. Черная полоса, кажется, «выпадает» из этой серой области и оказывается в середине моего окна.

Я пробовал установить "Просмотр отображения строки состояния на основе контроллера" на НЕТ. Затем добавление следующего в prefersStatusBarHidden избавляет от надоедливой панели, но тогда моя навигационная панель обрезается сверху!

- (BOOL)prefersStatusBarHidden
{
 UIDeviceOrientation orientation = [[UIApplication sharedApplication]    statusBarOrientation];
  switch(orientation) {
    case UIDeviceOrientationLandscapeLeft:
    case UIDeviceOrientationLandscapeRight:
      return NO;

    default:
      return YES;
  }
}

Мне интересно, знает ли кто-нибудь из вас причину / лекарство от этого?

Смотрите ниже снимки экрана ...

Черная полоса!

Черная полоса

Приложение работает нормально, серая область для заметок вверху экрана.

Приложение работает нормально


person Niall    schedule 16.10.2014    source источник


Ответы (2)


Я исправил свои проблемы ...

  1. Установка «Просмотр внешнего вида строки состояния на основе контроллера» на НЕТ.

  2. Тестирование версии для iOS и соответствующая настройка фонового изображения NavBar ...

    NSString *version = [[UIDevice currentDevice] systemVersion];
    bool isAtLeastiOS_8 = [version floatValue] >= 8.0;
    
    if(isAtLeastiOS_8) {
      UIImage *bgImagePortrait = [UIImage imageNamed:@"NavBarPortrait.png"];    
      [self.navigationBar setBackgroundImage:bgImagePortrait forBarMetrics:UIBarMetricsDefault];
    } else {
      UIImage *bgImagePortrait = [UIImage imageNamed:@"NavBarPortrait.png"];
      UIImage *bgImageLandscape = [UIImage imageNamed:@"NavBarLandscape.png"];
    
      [[UINavigationBar appearance] setBackgroundImage:bgImagePortrait
                                   forBarMetrics:UIBarMetricsDefault];
    
      [[UINavigationBar appearance] setBackgroundImage:bgImageLandscape
                                   forBarMetrics:UIBarMetricsLandscapePhone];
    }
    
  3. Принятие потери строки состояния в ландшафтном режиме на iOS 8
person Niall    schedule 20.10.2014

У меня была аналогичная проблема: приложения для iPhone отображали черную полосу в альбомной ориентации на iPad с сетчаткой. Это происходит, только если я использую

- (BOOL) prefersStatusBarHidden { return NO; }

чтобы переопределить поведение iOS 8 по умолчанию, скрывающее строку состояния в альбомной ориентации.

Черная полоса у меня всегда имеет размер 300x20 точек (например, размер строки состояния в портретной ориентации за вычетом фрагмента шириной 20 пикселей) и имеет альфа около 0,9. Похоже, это маска, которую режим эмуляции iPhone на iPad использует для области строки состояния портретного режима приложения iPhone (!); если я не отменяю предпочтения iOS 8, поэтому в альбомной ориентации нет строки состояния, все работает нормально. Мне это кажется ошибкой в ​​эмуляции iOS 8 iPhone на iPad ... еще одна из длинной череды ошибок iOS 8 ... :-(

Мое «исправление» - отключить строку состояния только на iPad под управлением iOS 8+:

- (BOOL) prefersStatusBarHidden {
    if ([[[UIDevice currentDevice] model] hasPrefix:@"iPad"] &&
        (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1)) {
        return YES;
    }
    else return NO;
}
person Adam Wilt    schedule 10.11.2014