Alterando a cor da barra de status para ViewControllers específicos usando Swift no iOS8

190
override func preferredStatusBarStyle() -> UIStatusBarStyle {
 return UIStatusBarStyle.LightContent;
}

Usar o código acima em qualquer ViewController para definir a cor statusBar como White para um viewcontroller específico não funciona no iOS8 para mim . Alguma sugestão? Usando o método UIApplication.sharedApplication, a cor muda após as alterações necessárias no Info.plist para todo o aplicativo.

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

Como posso fazer alterações na cor da barra de status para alguns ViewControllers necessários e específicos ?

Anuj
fonte

Respostas:

348

Depois de ler todas as sugestões e experimentar algumas coisas, consegui que isso funcionasse para controladores de exibição específicos usando as seguintes etapas:

Primeiro passo:

Abra seu info.plist e insira uma nova chave denominada " Exibir aparência da barra de status baseada em controlador " para NÃO

Segundo passo (apenas uma explicação, não é necessário implementar isso):

Normalmente, colocamos o seguinte código no método application (_: didFinishLaunchingWithOptions :) do AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

mas isso afeta statusBarStyletodos os ViewControllers.

Então, como fazer isso funcionar para ViewControllers específicos - Etapa final:

Abra o arquivo viewcontroller no qual deseja alterar statusBarStylee insira o seguinte código viewWillAppear(),

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

Além disso, implemente o viewWillDisappear()método para esse viewController específico e coloque as seguintes linhas de código,

Swift 2

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default

}

Swift 3

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}

Esta etapa primeiro altera o statusBarStylepara o viewcontroller específico e depois o altera para defaultquando o viewcontroller específico desaparecer. A não implementação da viewWillDisappear()alteração mudará statusBarStylepermanentemente para o novo valor definido deUIStatusBarStyle.LightContent

Anuj
fonte
4
Observe que, se você definir Status bar is initially hidden = YESno arquivo info.plist, "Exibir aparência da barra de status com base no controlador = NÃO" fará com que a barra de status fique oculta.
xi.lin 20/08/2015
13
Se você voltar a UIStatusBarStyle.Defaultusar viewWillDisappear(), deverá viewWillAppear()inicializá-lo, em vez de viewDidLoad()... caso contrário, se voltar a essa exibição sem que ela precise ser recarregada, você não verá o StatusBarStyleque está esperando.
William GP
7
Para Swift 3: UIApplication.shared.statusBarStyle = .lightContent
ibrahimyilmaz
4
Ainda não está claro como você mudar a cor da barra de status
DoruChidean
4
Pessoal, o seu descontinuado do iOS 9
#
108

(Em 20 de setembro de 2019)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}
BennyTheNerd
fonte
7
Certifique-se chamar super.viewWillAppearSe você é copiar e colar este código
Stephen Silber
Editado para incluído super.viewWillAppear (). Obrigado @StephenSilber pela dica!
BennyTheNerd 5/05
você precisa substituir o preferidoStatusStyle ou ele não funcionará. Obrigado por apontar isso. +1
Alix
3
Usando UIApplication.shared.statusBarStyle = .lightContentresultados neste aviso do compilador: O setter para 'statusBarStyle' foi preterido no iOS 9.0: Use - [UIViewController preferênciaStatusBarStyle]
airowe
3
No Info.plist do seu aplicativo, defina "Exibir aparência da barra de status baseada em controlador" como YES
IvanPavliuk
29

Eu segui este tutorial e funcionou para mim. No entanto, não tenho certeza se há alguma ressalva.

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • Abra seu info.plist e defina UIViewControllerBasedStatusBarAppearancecomo false.
  • Na primeira função em AppDelegate.swift, que contém didFinishLaunchingWithOptions, defina a cor desejada.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Atualização Swift 3 *

    UIApplication.shared.statusBarStyle = .lightContent

chris_s
fonte
11
como é que específico para cada controlador de vista
Yarneo
4
Exatamente, isso é para o aplicativo completo, e essa não é a questão.
anuj
3
Estou usando o iOS 8 Swift e o xCode 6.1.1 e apenas seguir estas duas etapas não funciona. Você também precisa adicionar UIApplication.sharedApplication().statusBarHidden = falseao AppDelegate.swift didFinishLauchingWithOptions
Ahmad Amin
Isso configurou para todo o aplicativo. Para controladores de exibição específicos, consulte a primeira resposta. Funcionou para mim.
Akshar Patel
O setter para 'statusBarStyle' foi descontinuado no iOS 9.0: Use - [UIViewController preferênciaStatusBarStyle]
Oleksandr
29

Solução Swift 4.2 com NavigationController

Primeiro passo:

Abra seu info.plist e insira uma nova chave denominada " Exibir aparência da barra de status baseada no controlador " ou UIViewControllerBasedStatusBarAppearanceem SIM para permitir que cada VC use sua própria propriedade de status.

Segundo passo

Em cada VC, substitua a propriedade preferidaStatusBarStyle como esta:

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent //.default for black style
}

Último passo

Substitua a propriedade selectedStatusBarStyle na sua classe NavigationController customizada:

class NavigationController : UINavigationController {

override var preferredStatusBarStyle : UIStatusBarStyle {

    if let topVC = viewControllers.last {
        //return the status property of each VC, look at step 2
        return topVC.preferredStatusBarStyle  
    }

    return .default
}
guillama
fonte
Esta é apenas a maneira de obter o resultado esperado usando o Navigation Controller e seus próprios controladores. Além disso, você poderia fazer desta forma para prefersStatusBarHidden como eu fiz para o meu projeto :)
atereshkov
22

Há um bilhão de respostas aqui, então pensei em por que não adicionar outra na forma de uma extensão (com a ajuda do @ Cœur)

Swift 3

Extensão:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}

Implementação:

UIApplication.statusBarBackgroundColor = .blue
John R Perry
fonte
2
Observe que essa abordagem pode ser considerada como acessar uma API privada e pode significar que seu aplicativo será rejeitado pela Apple.
JWhitey
Ou pelo menos depende dos detalhes de implementação da Apple e pode ser interrompido sem aviso prévio com alterações no iOS.
Chris Prince
19

No seu Info.plist, você precisa definir Visualizar a aparência da barra de status baseada em controlador para qualquer valor.

Se você o definir SIM, deverá substituir a função preferidaStatusBarStyle em cada controlador de exibição.

Se você definir NÃO, poderá definir o estilo no AppDelegate usando

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
Nikita Khandelwal
fonte
7
setStatusBarStylefoi preterido no iOS 9.0
Jeffrey Neo
@ Jeffrey_Neo Embora isso seja verdade, não consigo fazer a substituição funcionar. Seria útil ver seu comentário como uma resposta com o código de trabalho.
dumbledad
15
override func viewWillAppear(animated: Bool) {
    self.navigationController?.navigationBarHidden =  true

    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
    if statusBar.respondsToSelector("setBackgroundColor:") {
        statusBar.backgroundColor = UIColor.redColor()
    }

}
AG
fonte
usando valueForKey("statusBar")pode não ser compatível com as diretrizes da Apple
Cœur
15

Swift 3

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

Essa é a solução para definir a cor de fundo da barra de status para um controlador de exibição específico.

Chris Tsitsaris
fonte
3
O UIView sempre responde ao backgroundColor no Swift.
Cœur
13

SWIFT 2

Consegui alterar com êxito a aparência do plano de fundo da barra de status adicionando o seguinte em meu viewWillAppear:

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }
AJ Hernandez
fonte
10

Implementar preferredStatusBarStylecomo você mencionou e chamada self.setNeedsStatusBarAppearanceUpdate()em ViewDidLoade também em Info.plist conjunto UIViewControllerBasedStatusBarAppearancepara YESYESpor padrão)

Não está claro por que ele não é necessidade working.I para verificar code.One outra sugestão é ir com código de trabalho em viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContente mudar isso para padrão quando você ver se desapareceram viewWillDisappear.

codester
fonte
Apenas implementar a primeira parte da resposta funcionou para mim. No entanto, eu não adicionei o UIViewcontrollerBasedStatusBarAppearance no Info.plist. Ainda funcionou.
Akshar Patel
10

para swift 3

.plist

View controller-based status bar appearance = NO

AppDelegate.swift

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Custom statubar
        UIApplication.shared.isStatusBarHidden = false
        UIApplication.shared.statusBarStyle = .lightContent
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        statusBar.backgroundColor = UIColor.gray

        return true
    }
Giang
fonte
1
Eu tentei todas as soluções ... isso só funcionou para mim !! Não sei porquê: D
Khaled Hayek
sorte do empate
Giang
O setter para 'isStatusBarHidden' foi descontinuado no iOS 9.0: Use - [UIViewController prefereStatusBarHidden] ...
empatou ..
9

Na minha situação, uso o storyboard para organizar meus controladores de exibição. Quero alterar todo o estilo da barra de status.

Você pode ver na figura abaixo.

insira a descrição da imagem aqui

StarsView Controller é um CPBaseNavigationController, e CPBaseNavigationControlleré subclasse deUINavigationController .

Eu tento fazer os próximos ajustes:

  1. Em AppDelegate.swiftfunc didFinishLaunchingWithOptions, adicione

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    mas sem efeito.

  2. No StoryBoard, localize a Base Tab BarController(foto acima) .select Attributes Inspector, altere o Sattus Baratributo para Light Content.so bad, sem efeito.

insira a descrição da imagem aqui

  1. Última vez que o recebi. No meu controlador de navegação personalizado CPBaseNavigationController, adicione funcpreferredStatusBarStyle

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
       return .LightContent
    }

    Isso funciona bem!

Além disso, statusBarStyleobsoleto no 9.0, você pode usar -[UIViewController preferredStatusBarStyle].

wenghengcong
fonte
9

Funciona para aplicativos baseados em navegação

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)
Jio
fonte
Onde adicionar esse código específico, não foi possível fazê-lo funcionar.
Anuj
Você pode adicioná-lo no arquivo delegado do aplicativo em didFinishLaunchingWithOptions
Jio
1
Não seria melhor usar addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). Bounds.width, 20) em vez da largura 320 codificada?
Torsten Ojaperv
Editado @TorstenOjaperv
Jio
Como fazer isso com o Swift 3.0?
YETI
8

Tudo é muito mais fácil no Swift 3.0 Xcode 8

Usando o código abaixo no arquivo App Delegate, após

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

insira isto:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
Anton Rússia
fonte
1
Os valores vermelho, verde e azul estão no intervalo de 0 a 1. Você precisa dividi-los por 255 ou isso não funcionará.
precisa saber é o seguinte
8

Swift 3

//
//  LoginController.swift
//  Swift 3
//
//  Created by The Crab on 17/01/2017.
//  Copyright © 2017 Paxi Labs. All rights reserved.
//

import UIKit

class LoginController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setNeedsStatusBarAppearanceUpdate()

        view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)

    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}
o caranguejo
fonte
7

Swift 4 Para o ViewController específico sem o NavigationViewController incorporado, basta adicioná-lo ao seu arquivo ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
Surjit Singh
fonte
Se temos um controlador de navegação incorporado, o que você faz?
Icekomo # 13/18
7

Outra maneira realmente fácil de fazer isso funcionar é apenas criar uma extensão da classe UINavigationController.

Como substituir o preferredStatusBarStyle:método não funcionará, a menos que o façamos dentro da classe UINavigationController.

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    }
azemi
fonte
4

Eu havia definido uma cor específica (no formato RGB) usando o código abaixo no App Delegatearquivo:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
. . .

 UIApplication.sharedApplication().statusBarHidden = false
        UIApplication.sharedApplication().statusBarStyle = .LightContent

        let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
        if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
            statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
        }

. . .
}

Você também precisa adicionar a chave abaixo no Info.plistarquivo:

Visualizar a aparência da barra de status baseada no controlador com o valor booleano definido como NO

Captura de tela 1

Captura de tela 2

Jayprakash Dubey
fonte
Com o Siwft 3.0, como fazer isso?
YETI
4

Eu posso sugerir uma maneira mais simples,

  1. Basta chamar setNeedsStatusBarAppearanceUpdate no viewDidLoad, como diz a documentação da Apple,

Chame esse método se os atributos da barra de status do controlador de exibição, como status ou estilo oculto / não oculto, mudarem. Se você chamar esse método dentro de um bloco de animação, as alterações serão animadas junto com o restante do bloco de animação.

  1. Implemente o preferencialStatusBarStyle retornando seu tipo preferido.

Funcionou para mim no iOS 10.1.

Objetivo C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Rápido

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Estou surpreso que ninguém tenha apontado isso. De qualquer forma, aproveite :)

Bhaumik Desai
fonte
4

Eu tive alguns problemas com este. Eu realmente não me senti bem em alterar globalmente a cor da barra de status na exibição e, em seguida, alterá-la novamente na exibição desapareceu como a resposta aceita. Acredite ou não, você pode conseguir isso substituindo o preferredStatusBarStyleseu controlador de exibição desejado. Depois de muito tempo, foi o que fiz para fazê-lo funcionar:

  1. Altere Visualizar aparência da barra de status baseada no controlador em info.plistYES.
  2. Agora qualquer controlador de exibição em tela cheia pode alterar o estilo da barra de status substituindo preferredStatusBarStyle.
  3. Eu especifiquei tela cheia porque isso não funcionará para controladores de exibição modal (tela não cheia), não sem definir modal​Presentation​Captures​Status​Bar​AppearanceSim.
  4. Além disso, se você tiver controladores de exibição incorporados, como em um controlador de navegação, por exemplo, ele solicitará ao controlador de exibição mais superior o estilo da barra de status. Substituir child​View​Controller​For​Status​Bar​Stylee passar o controlador de exibição incorporado deve funcionar, mas não funcionou para mim. Acabei de retornar a barra de status preferida dos controladores de exibição incorporada como o estilo preferido da barra de status. Algo assim:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }
John C.
fonte
Esta resposta me ajudou! Descobri que, por algum motivo, meu controlador de navegação (sendo apresentado de forma modal) não estava pedindo implicitamente ao controlador de exibição mais superior o estilo da barra de status. Então eu tive que subclassear UINavigationControllere substituir o child​View​Controller​For​Status​Bar​Stylevar lá, retornando self.topViewController.
Taber
3

No Swift 4 ou 4.2

Você pode adicionar no seu vc

preferidoStatusBarStyle

e defina o valor de retorno como

.lightContent ou .default

ex:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}
Ridho Octanio
fonte
3

(Em 10 de junho de 2020)

Swift 5 ( sem editar .Plistarquivo )

Se você estiver usando Storyboard, vá para NavigationController, selecione o navigationBar, clique no e Attributes Inspector, em seguida, altere o style. se você precisar light content( barra de status branca ), defina qualquer coisa, exceto defaultdigamos definir estilo blackE se você quiser dark content ( barra de status preta ), configure-adefault .

O padrão ( UIBarStyleDefault) resulta na UIStatusBarStyleDefaultbarra de status escura do primeiro plano . E UIBarStyleBlackdará uma UIStatusBarStyleLightContentbarra de status.

Programaticamente

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

Sem barra de navegação ( Editar.Plist )

adicione UIViewControllerBasedStatusBarAppearance/ View controller-based status bar appearanceao seu info.pliste defina o valor é true.

Overridea preferredStatusBarStylepropriedade no seu Controller

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}
jawadAli
fonte
2

Atualização do Swift 3.0

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
Jaseibert
fonte
2

O que funcionou comigo, no Storyboard, vá para o Navigation Controller, selecione a barra de navegação, clique no Attributes Inspector e mude o estilo de padrão para preto. É isso aí!

Amr
fonte
2

SWIFT 4.2 Ei, eu queria compartilhar uma solução, que funcionou para mim, que recebi de um ótimo artigo sobre esse assunto indescritível de Graig Grummitt.

Etapa 1 Como outros usuários mencionaram ADICIONAR abaixo ao seu PLIST

View controller-based status bar appearance YES

Etapa 2 no RootViewcontroller adicione abaixo

var statusBarHidden: Bool = false {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }

    var vcStatusBarStyle: UIStatusBarStyle = .default {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return vcStatusbarStyle
    }

Ao atualizar uma propriedade statusBarHiddenou vcStatusBarStyleela chamará setNeedsStatusBarAppearanceUpdate()e atualizará a barra de status com os novos valores para prefersStatusBarHiddenou preferredStatusBarStyle. Na minha situação, eu tive que atualizar essas propriedades para o container viewcontroller, que era o pai do childviewcontroller visível. Eu fiz isso usando um método delegado simples.

protocol MainViewControllerDelegate {
    func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
    func toggleStatusBar(visable: Bool)
}

É claro que ao instanciar o childViewController (Visible VC), não se esqueça de definir o MainViewcontroller (Container VC) como seu representante. Às vezes eu faço. :)

childViewController.delegate = self

Então, no childViewController, chamei o método delegate quando necessário para atualizar a barra de status.

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

Como mencionado acima, Graig Grummitt entra em mais detalhes sobre essa solução e também trabalha com os UINavigationControllers. Link aqui: O Caso Misterioso da Barra de Status

Erik Uecke
fonte
1

Clique no grupo Arquivos de Suporte (lado superior esquerdo do nome do seu projeto). Navegue para Informações. Clique em + em algum lugar entre as listas, como abaixo do nome do pacote. E adicione "Exibir aparência da barra de status baseada no controlador" e defina-o como NÃO. Em seguida, abra AppDelegate.swift e modifique assim:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

return true
}

É isso aí.

Goran Jakovljevic
fonte
Você leu a pergunta errado. Perguntei sobre como alterar o StatusBarStyle para controladores de exibição específicos, não para o aplicativo completo.
anuj
Veja minha resposta abaixo @Anuj
theCrab 17/17/17
1

Para o Xcode 10, você pode criar uma classe e colocá-la antes da classe viewController, você pode chamar essa classe em todos os controladores de exibição necessários, uma barra de status de conteúdo leve ...

class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}

Agora mude sua classe viewController em:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

E isso é tudo...

Fabio
fonte
1

Funciona para navegação com base em um controlador de exibição específico no swift4

   let app = UIApplication.shared
   let statusBarHeight: CGFloat = app.statusBarFrame.size.height

   let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
   statusbarView.backgroundColor = UIColor.red
   view.addSubview(statusbarView)
Gangireddy Rami Reddy
fonte
1

AVISO


O setter para 'statusBarStyle' foi descontinuado no iOS 9.0: Use - [UIViewController preferênciaStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

então minha solução foi a seguinte: fazer uma extensão do controlador de navegação:

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        if let topViewController = presentedViewController{
            return topViewController.preferredStatusBarStyle
        }
        if let topViewController = viewControllers.last {
            return topViewController.preferredStatusBarStyle
        }

        return .default
    }
}

e se você tiver um viewController que terá outro estilo que não o estilo do aplicativo, poderá fazer isso

var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
    return barStyle
}

digamos que você é o estilo de status do aplicativo .defaulte deseja que essa tela seja .lightContent assim, barStyle assumirá o .lightContentvalor padrão, isso mudará o estilo da barra de status para lightContent e certifique-se de viewWillDisappearalterar novamente o barStyle para o estilo da barra de status do aplicativo que no nosso caso é .default.

isso é funciona para mim

hesham ghalaab
fonte
1

Cor personalizada para a barra de status (iOS11 +, Swift4 +)

Se você está procurando uma solução, como alterar a barra de status para sua cor personalizada, essa é a solução que está funcionando.

let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
    statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
    statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
    statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue
Tung Fam
fonte