Изменение цвета фона строки состояния в Swift 3

В XCode 7.3.x ill изменил цвет фона для моей строки состояния с помощью:

func setStatusBarBackgroundColor(color: UIColor) {
guard  let statusBar = UIApplication.sharedApplication().valueForKey("statusBarWindow")?.valueForKey("statusBar") as? UIView else {
    return
}
statusBar.backgroundColor = color
}

но кажется, что это больше не работаю с Swift 3.0.

плохо старался с:

func setStatusBarBackgroundColor(color: UIColor) {
guard  let statusBar = (UIApplication.shared.value(forKey: "statusBarWindow") as AnyObject).value(forKey: "statusBar") as? UIView else {
    return
}
statusBar.backgroundColor = color
}

но это дает мне:

this class is not key value coding-compliant for the key statusBar.

есть идеи, как изменить его с помощью XCode8/Swift 3.0?

8 ответов


extension UIApplication {
    var statusBarView: UIView? {
        if responds(to: Selector("statusBar")) {
            return value(forKey: "statusBar") as? UIView
        }
        return nil
    }
}

UIApplication.shared.statusBarView?.backgroundColor = .red

" изменить " цвет фона строки состояния:

let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
let statusBarColor = UIColor(red: 32/255, green: 149/255, blue: 215/255, alpha: 1.0)
statusBarView.backgroundColor = statusBarColor
view.addSubview(statusBarView)

изменить цвет текста строки состояния:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

обновление: обратите внимание, что рамка строки состояния изменится при повороте представления. Вы можете обновить созданный фрейм подвида:

  • С помощью маски функциями автоматического изменения : statusBarView.autoresizingMask = [.flexibleWidth, .flexibleTopMargin]
  • наблюдения NSNotification.Name.UIApplicationWillChangeStatusBarOrientation
  • или переопределение viewWillLayoutSubviews()

на iOS 11 и Xcode 9 выполните следующие действия.

  1. создайте расширение до UIApplication класс:

    extension UIApplication { var statusBarView: UIView? { return value(forKey: "statusBar") as? UIView } }

  2. в вашем классе или там, где вы хотите изменить цвет фона строки состояния:

    UIApplication.shared.statusBarView?.backgroundColor = .red

  3. для светлого содержания или темного содержания строки состояния просто перейдите в информация.файл plist и добавьте следующую строку значения с значение нет.

контроллер на основе статус-бар внешний вид

  1. теперь просто установите содержание света или все, что вам нужно в вкладка Общие настроек вашего проекта.

попробуй такое

Goto ваша информация о приложении.файл plist

  1. установите внешний вид строки состояния на основе контроллера вида в NO
  2. установить стиль строки состояния в UIStatusBarStyleLightContent

затем перейдите к делегату приложения и вставьте следующий код, где вы устанавливаете RootViewController Windows.

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0,[UIScreen mainScreen].bounds.size.width, 20)];
    view.backgroundColor=[UIColor blackColor];
    [self.window.rootViewController.view addSubview:view];
}

для Xcode 9 и iOS 11: Стиль строки состояния, которую мы попытаемся достичь, - это строка состояния с белым содержимым. Перейдите к ViewController.swift файл и добавить следующие строки кода.

override var preferredStatusBarStyle: UIStatusBarStyle {

     return .lightContent

}

или из опции настройки проекта вы можете изменить стиль строки состояния:

enter image description here

затем вернитесь к раскадровке, выберите контроллер вида и в меню редактор выберите встроить в навигационный контроллер. Выберите Панель навигации и в Инспекторе атрибутов установите цвет оттенка панели на красный. Раскадровка будет выглядеть так. enter image description here

создайте и запустите проект, содержимое строки состояния снова темное, что является значением по умолчанию. Причина этого в том, что iOS запросила стиль строки состояния навигационного контроллера вместо контроллера содержащегося вида.

enter image description here

изменить стиль навигации контроллер внутри приложения измените следующий метод в AppDelegate.файл swift.

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
    }

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

enter image description here


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any] ?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
}

это работает для меня, так как моя навигация barTintColor была черной и не могла видеть строку состояния.

при установке выше кода строка состояния didFinishLaunch отображается белым цветом.


С помощью Swift 3 и 4 вы можете использовать фрагмент кода ниже. Он находит вид из UIApplication используя valueForKeyPath как установить цвет фона.

guard let statusBarView = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else {
        return
    }
statusBarView.backgroundColor = UIColor.red

С

UIView *statusBarView = [UIApplication.sharedApplication valueForKeyPath:@"statusBarWindow.statusBar"];
if (statusBarView != nil)
{
    statusBarView.backgroundColor = [UIColor redColor];
}

вы можете установить цвет фона для строки состояния во время запуска приложения или во время viewDidLoad вашего контроллера вида.

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

// Set upon application launch, if you've application based status bar
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
        return true
    }
}


or 
// Set it from your view controller if you've view controller based statusbar
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
    }

}



Вот результат:

enter image description here