9
votes

Modifier la couleur d'arrière-plan de la barre d'état dans iOS13

Avec iOS13, je ne peux plus changer la couleur d'arrière-plan de la barre d'état car la barre d'état n'est plus accessible en utilisant "valeur pour clé". Quelqu'un a-t-il compris comment cela est possible ou sait-on que cela sera possible dans la version finale d'iOS13?

Je suis tombé sur différentes propositions comme utiliser le StatusBarView UIApplications (plus accessible dans xcode 11, beta 7) ou utiliser le statusbarmanager. Les deux ne donnent pas accès à la barre d'état.

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
  statusBar.backgroundColor = <Some Color>
}

Je m'attends à ce que la barre d'état obtienne la couleur d'arrière-plan dont j'ai besoin.


3 commentaires

vérifiez cette réponse stackoverflow.com/a/57152709/8687925 .


Merci @SAXENA - cela semble nécessiter une barre de navigation pour activer l'apparence. Je cherche un moyen sans barre de navigation.


@Nij voyez ceci pour obtenir de l'aide: Comment changer la couleur d'arrière-plan de la barre d'état et la couleur du texte sur iOS 13?


10 Réponses :


0
votes
 let appearance = UINavigationBarAppearance()
 appearance.backgroundColor = .blue
 self.navigationController?.navigationBar.scrollEdgeAppearance = appearance
I hope, this will help you.

1 commentaires

non cela n'a pas aidé que la couleur de NavigationBar fixe seulement pas la couleur de la barre d'état



-2
votes
if let statusBar = UIStatusBarManager.self as? UIView {
    if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
        statusBar.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    }
}
I hope this works for you

3 commentaires

J'ai besoin en obj c pas rapide


Pour autant que je sache, il n'y a actuellement aucun moyen de le faire dans Objective-C @Vinodh


La conversion de 'UIStatusBarManager.Type' vers un type non lié 'UIView' échoue toujours



0
votes

Essaye ça

if #available(iOS 13.0, *) {
    let navBarAppearance = UINavigationBarAppearance()
    navBarAppearance.configureWithOpaqueBackground()
    navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
    navBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
    navBarAppearance.backgroundColor = <insert your color here>
    navigationBar.standardAppearance = navBarAppearance
    navigationBar.scrollEdgeAppearance = navBarAppearance
}


1 commentaires

non cela n'a pas aidé que la couleur de NavigationBar fixe seulement pas la couleur de la barre d'état



3
votes

Vous pouvez simplement définir la couleur d'arrière-plan de la vue de base dans votre ViewController si vous n'utilisez pas NavigationController

view.backgroundColor = .blue


0 commentaires

6
votes

Version Objective-C utilisant UIStatusBarManager:

UIView *statusBar = [[UIView alloc]initWithFrame:[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager.statusBarFrame] ;
statusBar.backgroundColor = [UIColor whiteColor];
[[UIApplication sharedApplication].keyWindow addSubview:statusBar]


0 commentaires

1
votes

La barre d'état essaiera de correspondre à la couleur de l'application

si vous avez une barre de navigation

webView.scrollView.backgroundColor = UIColor.blue

s'il n'y a pas de barre de navigation

view.backgroundColor = UIColor.blue

si votre arrière-plan est une vue Web

self.navigationBar.barTintColor = UIColor.blue

or

UINavigationBar.appearance().barTintColor = UIColor.blue

il y a probablement plus de cas qui me manquent


0 commentaires

1
votes

Appelez ceci dans votre contrôleur de vue de base

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


0 commentaires

5
votes

Utilisez ceci sur votre ViewController préféré

override func viewDidAppear(_ animated: Bool) {
    if #available(iOS 13, *)
    {
        let statusBar = UIView(frame: (UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame)!)
        statusBar.backgroundColor = UIColor.systemBackground
        UIApplication.shared.keyWindow?.addSubview(statusBar)
    }
}

vous pouvez utiliser votre couleur dans "UIColor.systemBackground"


3 commentaires

Avons-nous besoin d'ajouter ceci à chaque ViewController? Et si nous voulons jouer dans toute l'application.


Ne fonctionne pas car 'keyWindow' est obsolète dans iOS 13.0: ne doit pas être utilisé pour les applications qui prennent en charge plusieurs scènes car il renvoie une fenêtre clé sur toutes les scènes connectées


Comment supprimer la statusBar lorsque viewWillDisappear () est appelé?



0
votes

J'utilisais la classe centrale ThemeManager où je définissais toutes les couleurs de l'interface utilisateur. Voilà comment je l'ai résolu. Vous pouvez prendre des éléments de solution qui correspondent à vos besoins:

  let sharedApplication = UIApplication.shared
  sharedApplication.delegate?.window??.tintColor = setYourColor

  if #available(iOS 13.0, *) {
        let statusBar = UIView(frame: (sharedApplication.delegate?.window??.windowScene?.statusBarManager?.statusBarFrame)!)
        statusBar.backgroundColor = setYourColor
        sharedApplication.delegate?.window??.addSubview(statusBar)
    } else {
        // Fallback on earlier versions
        sharedApplication.statusBarView?.backgroundColor = setYourColor
  }



extension UIApplication {

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


1 commentaires

Vous devez mettre cela dans DispatchQueue pour fonctionner.



0
votes

Le code fonctionne pour Swift 5+ et iOS 13+

Pour changer la couleur d'arrière-plan de StatusBar, j'ai créé une classe de base de UIViewController afin que je puisse hériter du même code dans tous les contrôleurs de vue.

Ajout de "statusBarColorChange ()" à l'extension UIViewController.

class BaseClass: UIViewController {

   override func viewWillAppear(_ animated: Bool) {
       self.statusBarColorChange()
   }    
}

class ChatListViewController: BaseClass {} 

Créé la classe de base et hérité dans d'autres classes.

extension UIViewController {

  func statusBarColorChange() {

    if #available(iOS 13.0, *) {

        let statusBar = UIView(frame: UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
        statusBar.backgroundColor = .appNavigationThemeColor
            statusBar.tag = 100
        UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.addSubview(statusBar)

    } else {

            let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
            statusBar?.backgroundColor = .appNavigationThemeColor

        }
    } }

L'espoir aidera :)


0 commentaires