UIStatusBarStyle não funciona em Swift

85

Estou tentando mudar a cor da barra de status em meu aplicativo Swift para branco, mas estou batendo em uma parede de tijolos. Eu tenho 3 ViewControllers que estão cada um embutido em um NavigationController (poderia ser esse o problema? Eu já tentei colocar o código na classe NavigationController.) Eu tentei os dois pedaços de código a seguir no didFinishLaunchingWithOptions do meu AppDelegate arquivo .swift, mas nenhum funcionou.

application.statusBarStyle = .LightContent

e

UIApplication.sharedApplication().statusBarStyle = .LightContent

Tudo o que o Docs tem a dizer sobre isso é que UIBarButtonStyle é um Int e me deu este snippet de enum que não me ajudou em nada com a implementação.

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

o que estou perdendo?

davidrayowens
fonte

Respostas:

145

Você tem duas opções.

Se você quiser continuar definindo manualmente o estilo da barra de status, continue fazendo o que está fazendo, mas você precisará adicionar a seguinte chave ao seu arquivo info.plist com um valor de NO.

Ver a aparência da barra de status baseada no controlador

Ou, se você quiser continuar a usar a aparência da barra de status baseada no controlador de visualização, em vez de definir o statusBarStyle do aplicativo, substitua preferredStatusBarStyle propriedade em cada controlador de visualização para o qual deseja especificar um estilo de barra de status.

Swift 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
Mick MacCallum
fonte
Eu tentei este código ... mas só obtenho a barra de status branca na primeira tela. Não estou obtendo a barra de status para o resto das telas :( .. alguma ajuda?
Rahul
7
Você deve definir a configuração "Exibir aparência da barra de status baseada no controlador" em seu plist como SIM.
StackUnderflow
1
Isso é apenas se você quiser usar uma aparência de barra de status baseada no controlador de visualização.
Sam Holmes
4
no iOS 10 (Swift 3.0) não é mais método, mas propriedade. Consulte: stackoverflow.com/questions/38862208/…
stevo.mit
apenas para uma tela
Oubaida AlQuraan
143

Swift 3.0

em AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Swift 2.2

em AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO
Maselko
fonte
1
Esta é a resposta perfeita :)
Jay Mayu
1
Resposta perfeita. Curto e grosso.
Mehul
3
desculpe, esta pode ser a resposta mais simples, mas definitivamente não é a MELHOR: porque apenas define esse estilo para todos e quaisquer viewControllers no aplicativo. O comportamento foi introduzido para permitir um controle mais preciso e aplicar diferentes configurações com base em diferentes controladores de visualização (por exemplo, misturar conteúdos claros e escuros).
auco
É bizarro - não o que dizem os documentos da Apple, mas funciona. Tentei várias outras maneiras, incluindo ter uma barra de status baseada em UIViewController, nenhuma delas funcionou.
n13
33

Você deve definir o:

navigationController.navigationBar.barStyle = .black

e o texto aparecerá em branco

Nico S.
fonte
1
Obrigado! Não havia nada ajudou até mesmo essa substituição func preferredStatusBarStyle () -> UIStatusBarStyle {return UIStatusBarStyle.LightContent} isso realmente ajuda: navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true
Svitlana
Obrigado! Você salvou meu dia. No entanto, BlackTranslucent está obsoleto. Portanto, usei navigationController.navigationBar.barStyle = .Black
hsusmita
Está funcionando perfeitamente override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }. Você apenas tem que escrever esta linha viewDidLoadpara trabalhar bem. Certifique-se de seguir View controller-based status bar appearance = YESesta solução.
Bhavin_m
parece um exagero ... apenas tentei e funcionou assim no arquivo Info.plist: 1. Estilo da barra de status -> UIStatusBarStyleLightContent 2. Ver a aparência da barra de status baseada no controlador -> NÃO
raistlin
Fazer essa alteração fez meu botão Voltar desaparecer.
Leon
21

Para iOS9.x e Xcode7, basta colocar dentro AppDelegate.swift:

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

    UINavigationBar.appearance().barStyle = .Black

} 

Isso mudará automaticamente o estilo da sua barra de status para .Lightcontent para todos os controladores de visualização dentro de um UINavigationController.

(Além disso, exclua View controller-based status bar appearancedo Info.plist para suprimir os avisos que você provavelmente está vendo também!)

Biodave
fonte
obrigado. Parece haver um bug sério no iOS9. Essa era a única maneira de transformar a barra de status no branco do VC inicial. Eu tentei de tudo. Vou registrar um radar.
1b0t
preferredStatusBarStyle retornando UIStatusBarStyleDefault, mas não atualizando lightcontent para darkcontent para viewcontroller específico. Após self.navigationController.navigationBar.barStyle = UIBarStyleDefault; em viewWillAppear funcionou para mim. Espero que este comentário ajude outras pessoas.
Pandey_Laxman
Observe que o UIStatusBarStyle foi alterado para ".black" (B minúsculo) no Swift 3
brycejl
16

No Swift 3, o estilo da barra de status mudou para uma propriedade computada em UIViewController que você pode substituir assim:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 
Eric Welander
fonte
13

No iOS 9, o seguinte (setStatusBarStyle) está obsoleto e você receberá um aviso se for assim.

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

Se você quiser que todos os statusBars sejam alterados de uma só vez, tente adicionar o seguinte ao seu Info.plist. Isso também deixará a barra de status da tela de inicialização branca. Enquanto o código acima não vai.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
GuiSoySauce
fonte
A abordagem .plist está correta, mas setStatusBarStyle () não é necessário. 'setStatusBarStyle (_: animated :)' foi descontinuado no iOS 9.0: Use - [UIViewController preferredStatusBarStyle]
Bill Chan
@BillChan obrigado por comentar, mas por favor leia o ganho de resposta. Já expliquei que 'setStatusBarStyle' foi descontinuado. Você deve usar preferredStatusBarStyle se quiser um ou outro viewControllers alterado. A abordagem plist é para quem deseja que todos os viewControllers sejam alterados de uma só vez. Aqui não há certo ou errado. É só uma questão de o que você precisa alcançar.
GuiSoySauce
1
UIStatusBarStyle = UIStatusBarStyleLightContent (em .plist) ajudou a lançar meu aplicativo com o texto da barra de status em branco ... Obrigado !!!
Chris Allinson
10

para mim, tudo acima não funcionou até eu adicionar:

self.navigationController?.navigationBar.barStyle = .black;

então:

  1. Definido UIViewControllerBasedStatusBarAppearancepara YESem.plist
  2. Em viewDidLoadchamadaself.setNeedsStatusBarAppearanceUpdate();
  3. Substituir preferredStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. No método substituído, defino também o navigationBar.barStyleso final
    para o conteúdo de luz :
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    e para o preto conteúdo de , use o padrão

A fonte daqui e daqui .

e se isso não funcionar, você pode tentar adicionar um UINavigationController extension:

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

        return .default
    }
}
Constantin Saulenco
fonte
1
Nenhum comentário sobre o estilo da barra de navegação ... mas no Swift 3, Xcode 8 - esta foi a única solução que funcionou para mim.
Despotovic
A única desvantagem que notei é que com todas essas etapas ele muda, mas sem animação
Lukasz 'Severiaan' Grela
6

Estranho, usando Swift 3.1 e XC8.2.1, mas todas as opções acima não funcionaram.

O que eu fiz é só

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        get {
            return .lightContent
        }
    }
}

Sem Plist, sem outras coisas. HTH

Lord iPhonius
fonte
Funciona para Swift 4.2 também.
zeeshan
2

No Swift 3.0, você pode substituir um getter no ViewController para a aparência da barra de status baseada no controlador do View:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}
Denis Kreshikhin
fonte
1

Não edite seu Info.plist. Adicione isso ao seu ViewController.swift:

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

Etapa 1. Adicionar a info.plist View controller-based status bar appearance -> NO

Etapa 2. Adicione o código no método em que você precisa alterar a cor da barra de status:

UIApplication.shared.statusBarStyle = .lightContent //(or .default)
setNeedsStatusBarAppearanceUpdate()

Linha chave do código: setNeedsStatusBarAppearanceUpdate()

Igor
fonte