Строка состояния показывает черный текст, только в симуляторе iPhone 6 iOS 8

Я пытаюсь преобразовать свое приложение iOS 7 в iOS 8 в Xcode 6 GM, и когда я запускаю его на симуляторах iPhone 5s или ниже с iOS 8, все в порядке, но на симуляторах iPhone 6 и 6 Plus отображается строка состояния имеет черный текст вместо белого, как и везде в любое время. Я установил для Info.plist UIStatusBarStyle значение «Прозрачный черный стиль (альфа 0,5)» через Xcode, и, похоже, это дает желаемый эффект повсюду. Есть идеи, что происходит?

(Я еще не трогал ни одну из раскадровок, может быть что-нибудь с этим? Я надеялся, что смогу отложить это на некоторое время :)


person Mohamed Hafez    schedule 16.09.2014    source источник
comment
Итак, у меня такая же проблема, но в двух моих приложениях она немного отличается: в одном приложении он сначала становится черным во время заставки, а затем становится белым после загрузки пользовательского интерфейса, как я хочу. На iOS 7 всегда нормально запускался белым цветом. В другом приложении он просто все время остается черным на iOS 8, по крайней мере, я так думал. Оказывается, на iPhone 5S под управлением iOS 8 он белый, как и должно быть. И на iPhone 6 с увеличенным UI все нормально, но не со стандартным UI. IPhone 6 Plus всегда черный, независимо от масштабирования пользовательского интерфейса или стандартного ... Наверное, это ошибка в iOS 8, я думаю ...   -  person CMash    schedule 22.09.2014


Ответы (14)


Эта ошибка возникает только в том случае, если ваше приложение масштабируется в соответствии с разрешением новых устройств.

Быстрое исправление (кто знает, будет ли это решено в 8.1) - обеспечить правильное разрешение загрузки изображений в вашем пакете приложения.

Из https://developer.apple.com/ios/human-interface-guidelines/graphics/launch-screen/

For iPhone 7, iPhone 6s, iPhone 6:

750 x 1334 (@2x) for portrait
1334 x 750 (@2x) for landscape

For iPhone 7 Plus, iPhone 6s Plus, iPhone 6 Plus:

1242 x 2208 (@3x) for portrait
2208 x 1242 (@3x) for landscape

В моем приложении мы поддерживаем только портретную ориентацию, поэтому это исправлено с помощью разрешений 750x1334 и 1242x2208.

И просто чтобы подтвердить, если это не было очевидно, вам ОБЯЗАТЕЛЬНО нужно использовать UIStatusBarStyleLightContent для стиля строки состояния.

person Aaron Wasserman    schedule 23.09.2014
comment
Я пробовал это решение, я все еще вижу проблему, описанную в @CMash. - person cthomaschase; 25.09.2014
comment
РЕДАКТИРОВАТЬ: Не уверен, распознаются ли новые изображения запуска, но это решение сработало после того, как я добавил их в раздел UILaunchImages в info.plist. - person cthomaschase; 25.09.2014
comment
Также вы можете использовать новые наконечники изображений запуска, как я указал в своем ответе, что, безусловно, устраняет проблему! - person CMash; 10.10.2014
comment
Добавление загружаемых изображений с правильным разрешением, скорее всего, потребует от вас переделки пользовательского интерфейса, поскольку это больше не система координат точек 320x568 - если только вы не выложили все идеально с первого раза! Для остальных из нас, кто хочет масштабировать свое приложение И стиль UIStatusBarStyleLightContent, это не годится ... - person OpenUserX03; 24.10.2014
comment
@Aaron Wasserman, в моем проекте я скрываю строку состояния для всего приложения, поэтому я настраиваю Info.plist (StatusBar изначально скрыт = YES & View-Controller Based ... = NO) .Когда я открываю ImagePickerController из своего приложения, Строка состояния отображается, но не скрывается. (Примечание: эта проблема есть только на симуляторе iPhone 6 и 6+, но не на iPhone 4 и 5) .Спасибо. - person Divyesh Dobariya; 04.11.2014
comment
Вероятно, есть причина, по которой кто-то использует масштабированную версию приложения на iPhone 6, поэтому прекратить использовать ее для исправления ошибки - это не лучшее решение. - person manecosta; 12.01.2015

Итак, вот как я это исправил

В строке состояния на основе контроллера просмотра PLIST НЕТ Стиль строки состояния UIStatusBarStyleLightContent

В приложенииDelegate DidFinishLaunching

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
    [self.window setBackgroundColor:[UIColor whiteColor]];

В каждом контроллере представления

- (UIStatusBarStyle) preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}
person Taylor Pierce    schedule 22.09.2014
comment
Это не очень хороший ответ. Я так и сделал, и это совершенно не помогает. Это больше похоже на ошибку iPhone 6. В дополнение к этому, если для строки состояния на основе контроллера представления установлено значение НЕТ, что хорошего в том, чтобы вернуть предпочтительный стиль строки состояния в каждом контроллере представления? - person Legoless; 24.09.2014
comment
Сработало для меня, но нет смысла добавлять предпочитаемыйStatusBarStyle к каждому контроллеру представления, если вы специально указали в info.plist, что свойство не основано на контроллере представления. Мне также не нужно было устанавливать цвет фона окна. - person manecosta; 12.01.2015
comment
Работал для меня, но нужна была только первая строка - person josef; 10.02.2015
comment
Здесь нужна вторая строка (Код в каждом контроллере представления) - person Omar Sultan; 14.02.2015

Строка состояния моего приложения работала нормально в iOS 7, используя только настройки проекта / цели:

Status bar style = UIStatusBarStyleLightContent

а также

View controller-based status bar appearance = NO

но в iOS 8 (симуляторы iPhone 6 и iPhone 6 Plus) строка состояния не отображалась. Изменение внешнего вида строки состояния на основе контроллера View на ДА, а затем добавление:

    // Objective C
    - (UIStatusBarStyle) preferredStatusBarStyle {
         return UIStatusBarStyleLightContent;
    }
    //Swift
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
    }

к ViewController, снова увидела белую строку состояния, но только после запуска исходного корневого контроллера. При первом запуске строка состояния остается черной.

person Tony Adams    schedule 19.09.2014
comment
Я пробовал это в своем приложении, которое запускает черный цвет, а затем меняет его на белый после всплеска (отлично работало на iOS 7), и оно все еще запускается в черном цвете, чтобы начать с :( - person CMash; 22.09.2014
comment
Это также может быть ограничено моделями iPhone 6, поскольку некоторые из проблем с цветом строки состояния, которые я видел, не возникают на iPhone 5S под управлением iOS 8 ... - person CMash; 22.09.2014
comment
@CMash - да - спасибо. Я наблюдаю такое же поведение. Я отредактирую ответ, чтобы прояснить это. - person Tony Adams; 08.10.2014
comment
@Tony: Почему не быстрая версия? - person lee; 15.09.2015
comment
@lee - отличный вопрос! Я отредактировал ответ, включив оба. Спасибо! - person Tony Adams; 15.09.2015

Аналогичный ответ (в настоящее время проголосовавший за 2-й) уже опубликован, покупайте в интересах поддержания этого сообщения в актуальном состоянии, вот версия Swift.

  1. Добавьте в файл info.plist строку под названием Просмотр внешнего вида строки состояния на основе контроллера и установите для нее логическое значение НЕТ.

  2. В файл AppDelegate.swift добавьте следующий метод: func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { UIApplication.sharedApplication().statusBarStyle = .LightContent return true }

  3. Мне не нужно было делать этот шаг, чтобы он работал (т.е. выполните шаги 1 и 2, и он может сработать). Если нет, попробуйте добавить следующий метод к каждому из ваших ViewController:

    override func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent }

Я надеюсь, что это было полезно,

Лоик

person Loic Verrall    schedule 18.12.2014
comment
Очень полезно! Мне нужно было сделать только шаги 1 и 2. - person mbuff24; 05.05.2015
comment
Не уверен, но я испытываю эту проблему при тестировании на реальном iPhone 6 / 6Plus. Не бывает с другими моделями ... очень странно. Я установил стиль строки состояния раскадровки по умолчанию и безрезультатно. Это сработало. - person Alan; 11.02.2016
comment
@Alan стиль строки состояния раскадровки на самом деле является просто визуализацией в раскадровке, то есть он не влияет на строку состояния, когда приложение действительно запускается. - person Loic Verrall; 11.02.2016
comment
У меня снова возникла та же проблема с iPad Pro, и, поскольку вы не можете загрузить статическое изображение запуска для iPad Pro, я не мог использовать первый ответ (и я не могу использовать файл запуска раскадровки, потому что я без использования автопрокладки). Выполнение шагов 1 и 2 здесь сработало. Спасибо! - person Mohamed Hafez; 26.02.2016

  1. Открыть Info.plist
  2. Добавьте новое свойство под названием «Просмотр внешнего вида строки состояния на основе контроллера» (логическое значение) и установите для него значение «NO».
  3. Добавьте новое свойство под названием «Стиль строки состояния» (строка) и установите для него значение «Непрозрачный черный стиль».

Выполнено.

person José    schedule 10.08.2015

Добавьте следующую строку в метод AppDelegate didFinishLaunchingWithOptions:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];
person Teja Kumar Bethina    schedule 26.09.2014
comment
это сработало для меня, но UIStatusBarStyleBlackOpaque устарел, поэтому я использую: [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleLightContent animated: NO]; - person Rosswerks; 10.10.2014
comment
Если ваше приложение поддерживает все эти версии iOS 6, 7 и 8, вам следует использовать UIStatusBarStyleBlackOpaque. - person Teja Kumar Bethina; 13.10.2014
comment
То же самое сработало и у меня. Мне не нужно было переопределять предпочтительныйStatusBarStyle на каждой странице - person Oren; 21.11.2014
comment
Это работает даже без изменения изображения запуска и беспорядка в системе координат точки. - person Stefan Arn; 02.12.2014

Шаг 1. Откройте файл info.plist вашего приложения и установите для UIViewControllerBasedStatusBarAppearance значение NO.

Шаг 2: файл info.plist вашего приложения и установите "Стиль строки состояния" на UIStatusBarStyleLightContent.

person Kakashi    schedule 18.05.2015

Может быть проблема с симулятором. Используйте это, чтобы переопределить строку состояния по умолчанию или строку состояния для определенного контроллера представления.

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
} //This is swift code
person Saqib Omer    schedule 16.09.2014

Я знаю, что переопределять поведение в базовом классе с использованием категории - плохой стиль, но это работает и может быть самым быстрым решением для его исправления.

Шаг №1: Убедитесь, что для UIViewControllerBasedStatusBarAppearance или View controller-based status bar appearance установлено значение YES в файле plist вашего приложения.

Шаг №2: Добавьте в свой проект следующий код:

@implementation UIViewController (StatusBarColorFix)

- (UIStatusBarStyle) preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

@end
person Sandy Chapman    schedule 06.10.2014

Хорошим решением для этого является использование новой поддержки пера изображения запуска, которая используется на моделях iPhone 6. Похоже, что в iOS 8 есть ошибка, которая означает, что модели iPhone 6 не проверяют правильно стиль строки состояния при запуске, но она решается, если вы добавляете перо запуска.

Как отметил Аарон Вассерман, вы также можете указать, что iPhone 6 и 6+ запускают PNG, и, похоже, это тоже решает проблему, если вы настроили их правильно!

person CMash    schedule 10.10.2014

Здесь представлены рекомендации / инструкции Apple по строка состояния / изменение цвета текста.

Вот - Как изменить стиль строки состояния:

Если вы хотите установить стиль строки состояния, уровень приложения, тогда установите UIViewControllerBasedStatusBarAppearance в NO в вашем файле `.plist '.

Или программно вы можете сделать из App Delegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}

Если вы хотите установить стиль строки состояния, на уровне контроллера представления выполните следующие действия:

  1. Установите UIViewControllerBasedStatusBarAppearance в YES в файле .plist, если вам нужно установить стиль строки состояния только на уровне UIViewController.
  2. В функции добавления viewDidLoad - setNeedsStatusBarAppearanceUpdate

  3. переопределить предпочтительныйStatusBarStyle в вашем контроллере представления.

-

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Установите значение .plist в соответствии с уровнем настройки стиля строки состояния. введите описание изображения здесь

person Krunal    schedule 27.10.2017

В раскадровке выберите контроллер корневого представления и установите тип строки состояния по умолчанию.

person Shafraz Buhary    schedule 16.12.2014

Я выполнил следующие шаги, и они сработали для меня достаточно хорошо, также должны работать в iOS 8+.

1) Добавлено свойство Просмотр внешнего вида строки состояния на основе контроллера => НЕТ в Info.plist.
2) Добавьте следующий фрагмент кода в - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions в AppDelegate .m

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
    [self.window setBackgroundColor:[UIColor redColor]]; // Change color as per need.

3) Метод переопределения в ViewController

- (UIStatusBarStyle) preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}
person Aamir    schedule 27.02.2017

Для swift 4 и iOS 11

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}
person eladHayun    schedule 27.10.2017