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?

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
}

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

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


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


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
} 

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/>

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

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


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

1

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

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.