Подтвердить что ты не робот

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

В XCode 7.3.x плохо изменил цвет фона для моего StatusBar с помощью:

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?

4b9b3361

Ответ 1

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

UIApplication.shared.statusBarView?.backgroundColor = .red

Обновление для iOS 13

Приложение называется -statusBar или -statusBar Window на UIApplication: этот код должен быть изменен, так как больше нет строки состояния или строки состояния окно. Вместо этого используйте объект statusBarManager на сцене окна.

См. Как изменить цвет фона строки состояния и текста на iOS 13?

Ответ 2

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

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

Ответ 3

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

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

Objective-C

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

Ответ 4

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

override var preferredStatusBarStyle: UIStatusBarStyle {

     return .lightContent

}

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

enter image description here

Затем вернитесь к раскадровке, выберите View Controller и в меню редактора выберите Embed in Navigation Controller. Выберите панель навигации и в инспекторе атрибутов установите цвет "Оттенок панели" на красный. Раскадровка будет выглядеть следующим образом. 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

Ответ 5

Для iOS 11 и Xcode 9 используйте следующие шаги.

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

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

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

    UIApplication.shared.statusBarView?.backgroundColor =.red

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

Просмотр внешнего вида строки состояния контроллера

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

Ответ 6

Попробуйте

Перейти к вашему приложению info.plist

  • Установить вид состояния на основе контроллера на NO
  • Установите стиль строки состояния в 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];
}

Ответ 7

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

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

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

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

Ответ 8

Вы можете установить цвет фона для строки состояния во время запуска приложения или во время 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

Ответ 9

Возможное решение - добавить представление, которое будет использоваться в качестве фона statusBar на вашем viewController:

let frame = screenController.view.convert(UIApplication.shared.statusBarFrame, to: screenController.view)
let backview = UIView(frame: frame)

backview.backgroundColor = backgroundColor
screenController.view.addSubview(backview)
screenController.view.bringSubviewToFront(backview)

Ответ 10

Добавьте следующий код в свой файл расширения для редактирования строки состояния в swift 4 и выше:

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

Теперь мы можем отредактировать строку состояния, добавив следующую строку в наш класс ViewController:

UIApplication.shared.statusBarView?.backgroundColor = <Your Color name>

ex: UIApplication.shared.statusBarView?.backgroundColor = .red

Надеюсь, это будет полезно. Спасибо

Ответ 11

Правильное решение для Swift 4+ и iOS 13+

if #available(iOS 13.0, *) {
    let navBarAppearance = UINavigationBarAppearance()
    navBarAppearance.configureWithOpaqueBackground()
    navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
    navBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
    navBarAppearance.backgroundColor = UIColor.Theme.primary
    navigationBar.standardAppearance = navBarAppearance
    navigationBar.scrollEdgeAppearance = navBarAppearance
}

enter image description here

Ответ 12

Я сделал это расширение, чтобы изменить цвет строки состояния. Это не зависит от ключа. Так что гораздо безопаснее использовать

public extension UIViewController {
    func setStatusBar(color: UIColor) {
        let tag = 12321
        if let taggedView = self.view.viewWithTag(tag){
            taggedView.removeFromSuperview()
        }
        let overView = UIView()
        overView.frame = UIApplication.shared.statusBarFrame
        overView.backgroundColor = color
        overView.tag = tag
        self.view.addSubview(overView)
    }
}

Вот использование в любом месте viewcontroller:

setStatusBar(color: .red)

Ответ 13

У меня есть собственное решение для изменения строки состояния на iOS 13 и ниже. Вот как это сделать:

if #available(iOS 13.0, *) {
   let app = UIApplication.shared
   let statusBarHeight: CGFloat = app.statusBarFrame.size.height

   let statusbarView = UIView()
   statusbarView.backgroundColor = UIColor.red
   view.addSubview(statusbarView)

   statusbarView.translatesAutoresizingMaskIntoConstraints = false
   statusbarView.heightAnchor
     .constraint(equalToConstant: statusBarHeight).isActive = true
   statusbarView.widthAnchor
     .constraint(equalTo: view.widthAnchor, multiplier: 1.0).isActive = true
   statusbarView.topAnchor
     .constraint(equalTo: view.topAnchor).isActive = true
   statusbarView.centerXAnchor
     .constraint(equalTo: view.centerXAnchor).isActive = true

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

Gist

Также ознакомьтесь со статьей iOS 13 Как изменить цвет StatusBar?

И последнее, вы все еще можете изменить стиль строки состояния с помощью:

 override var preferredStatusBarStyle : UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
    //return UIStatusBarStyle.default   // Make dark again
}