iOS 7 и выше: установите статус-баре за просмотр контроллер



Я пробовал много способов установить стиль строки состояния (по умолчанию или lightcontent), но не могу заставить его работать на основе контроллера вида. Я могу установить стиль строки состояния только для всего приложения.

У кого-нибудь есть подсказка?

Я пытался UIViewControllerBasedStatusBarAppearance

И

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
}

, но эти методы не работают.

9 74

9 ответов:

Вы пробовали это?

  1. Установите в поле" вид панели состояния на основе контроллера " (UIViewControllerBasedStatusBarAppearance) значение YES.файл plist. (YES является значением по умолчанию, поэтому вы также можете просто исключить это значение из списка plist.)

  2. В методе viewDidLoad вызовите [self setNeedsStatusBarAppearanceUpdate].

  3. Реализовать preferredStatusBarStyle, возвращая стиль строки состояния, который требуется для данного контроллера вида.

    - (UIStatusBarStyle) preferredStatusBarStyle { 
        return UIStatusBarStyleLightContent; 
    }
    

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

[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
Это прекрасно сработало для меня.

Правка: это решение устарело на iOS 9. Пожалуйста, выберите один из других ответов.

С UIViewControllerBasedStatusBarAppearance, установленным в NO, я смог установить стиль белого текста с помощью:

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;

Это потому, что цвет текста в этом стиле был белым на iOS 6 и ниже.

Обновление: Согласно @jowie вы можете попробовать это на iOS8:

[UIApplication sharedApplication].statusBarStyle = UIBarStyleBlack;

В методе viewDidLoad поставьте следующее:

Цель С

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[self setNeedsStatusBarAppearanceUpdate];

Swift

UIApplication.shared.statusBarStyle = .lightContent
self.setNeedsStatusBarAppearanceUpdate()

В Swift я смог сделать это, написав:

let tbc : UITabBarController = self.window?.rootViewController as UITabBarController
var moreViewController : UINavigationController = tbc.moreNavigationController

moreViewController.navigationBar.barStyle = UIBarStyle.Black

В основном вас интересует последняя строка.
Это привело к изменению таббара на белый:

Введите описание изображения здесь

Обратите внимание, что я ничего не менял в Info.plist для достижения этого результата.
Для получения дополнительной информации об изменении Navigation Status Bar, пожалуйста, ознакомьтесь с этой ссылкой: http://www.appcoda.com/customize-navigation-status-bar-ios-7/

Держу пари, что ваш контроллер вида встроен в навигационный контроллер. Чтобы избежать установки стиля панели навигации в .Black Используйте этот подкласс:

class YourNavigationController: UINavigationController {
    override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return topViewController
    }
}

Свифт:

let tbc : UITabBarController = self.window?.rootViewController as UITabBarController
var moreViewController : UINavigationController = tbc.moreNavigationController
moreViewController.navigationBar.barStyle = UIBarStyle.Black

Цель С:

Добавьте это к методу controller.m file viewDidLoad:

[self setNeedsStatusBarAppearanceUpdate].

Затем реализуем этот метод в том же файле controller.m:

- (UIStatusBarStyle) preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
}

Официальные документы:

Https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html

Рекомендуемые Статья:

Http://www.ryadel.com/2015/03/04/xcode-set-status-bar-style-and-color-in-objective-c/

В ViewController, который вы хотите изменить цвет строки состояния

- (void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}

- (void) viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

Быстрое расширение для этого, потому что я всегда забываю, как это работает

extension UIViewController {
    // utility to set the status bar appearance
    // Note: Make sure "View controller-based status bar appearance" is set to NO in your target settings or this won't work
    func setStatusBarForDarkBackground(dark: Bool) {
        UIApplication.sharedApplication().statusBarStyle = dark ? .LightContent : .Default
        setNeedsStatusBarAppearanceUpdate()
    }
}