IOS 7 и более поздние версии: установить стиль строки состояния для каждого контроллера представления


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

Есть ли у кого намек?

Я пробовал UIViewControllerBasedStatusBarAppearance

и

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
}

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

Ответ 1

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

  • Установите "Просмотреть строку состояния на основе контроллера" (UIViewControllerBasedStatusBarAppearance) до YES в вашем Info.plist. (YES - значение по умолчанию, поэтому вы также можете просто оставить это значение вне вашего plist.)

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

  • Внедрите preferredStatusBarStyle, возвращая стиль строки состояния, который вы хотите для этого контроллера представления.

    - (UIStatusBarStyle) preferredStatusBarStyle { 
        return UIStatusBarStyleLightContent; 
    }
    

Ответ 2

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

[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];

Это отлично сработало для меня.

Ответ 3

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

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

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;

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

ОБНОВЛЕНИЕ:. Согласно @jowie, вы можете попробовать это на iOS8:

[UIApplication sharedApplication].statusBarStyle = UIBarStyleBlack;

Ответ 4

В режиме viewDidLoad поместите это:

Цель C

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

Свифта

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

Ответ 5

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

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

moreViewController.navigationBar.barStyle = UIBarStyle.Black

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

enter image description here

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

Ответ 6

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

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

Ответ 7

Swift:

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

Цель C:

присоединить это к методу 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/

Ответ 8

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

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

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

Ответ 9

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

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()
    }
}