Como definir o estilo da barra de status no Swift 3


186

Estou usando o Xcode 8.0 beta 4.

Na versão anterior, o UIViewController possui um método para definir o estilo da barra de status

public func preferredStatusBarStyle() -> UIStatusBarStyle

No entanto, eu achei que ele foi alterado para "Get Only only" no Swift 3.

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

Como posso fornecer o estilo para usar no meu UIViewController?


tente este var preferredStatusBarStyle: UIStatusBarStyle = .lightContent
— Anbu.Karthik

Respostas:


485

[ATUALIZADO] Para Xcode 10+ e Swift 4.2+

Este é o método preferido para iOS 7 e superior

Nos aplicativos Info.plist, defina View controller-based status bar appearancecomo YES.

Substituir preferredStatusBarStyle ( documentos da Apple ) em cada um dos seus controladores de exibição. Por exemplo:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

Se você tiver preferredStatusBarStyleretornado um estilo de barra de status preferido diferente com base em algo que muda dentro do seu controlador de exibição (por exemplo, se a posição de rolagem ou se uma imagem exibida está escura), convém chamar setNeedsStatusBarAppearanceUpdate()quando esse estado mudar.

iOS anterior à versão 7, método descontinuado

A Apple descontinuou isso e será removida no futuro. Use o método acima para não precisar reescrevê-lo quando a próxima versão do iOS for lançada.

Se o seu aplicativo for compatível com o seu Info.plist, defina View controller-based status bar appearancecomo NO.

No appDelegate.swift, a didFinishLaunchingWithOptionsfunção, adicione:

UIApplication.shared.statusBarStyle = .lightContent

Para o controlador de navegação

Se você usar um controlador de navegação e você quer o estilo barra de status preferencial de cada controlador de vista a ser utilizado e definir View controller-based status bar appearancea YESem seus aplicativoinfo.plist

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

3
Funciona para mim. Esqueceu de inserir a nova configuração primeiro no Info.plist.
— falsecrypt

1
@LightMan, o status da aplicação uBarStyle não está obsoleto, usei isso no iOS 11 e funciona.
— Sushobhit 27/10/19

1
O @Sushobhit setStatusBarStyle foi descontinuado no iOS 9, conforme usado nesta resposta. Mas você ainda possui UIApplication.statusBarStyle como uma propriedade somente leitura.
— LightMan 27/10

1
Há momentos em que você deseja defini-lo programaticamente devido à cor de cada visualização.
— Alejandro Cavazos

9
Você também pode remover a linha em appDelegate.swift e ir para Target -> Geral -> Informações de implantação -> Status Bar Style -> Luz
— Robert Veringa

162

Atualização mais recente (Xcode 10+ / Swift 4.2+)

Este artigo foi deixado intacto para qualquer pessoa disposta a entender a lógica por trás de diferentes abordagens presentes nos últimos anos. Enquanto isso, a partir do Xcode 10, a primeira abordagem do Swift 4.2 foi descontinuada e não é mais suportada (ou seja , não terá efeito se você tentar empregá-la). Ainda é indicado para suas informações entender melhor o raciocínio por trás da Plist.infoprática de sinalização e personalização.

Esclarecimento Importante

É muito importante entender duas abordagens para personalizar a aparência da barra de status. Eles são diferentes e não devem ser misturados.

Primeira abordagem - uma cor para todo o aplicativo (DEPRECATED desde iOS7)

Em info.plist, você encontra ou cria uma chave chamada

View controller-based status bar appearance

e defina para NÃO .

O que faz? Essencialmente, ele estabelece uma configuração que diz que, em seu aplicativo, a aparência da barra de status não é definida individualmente por cada controlador de exibição . Isso é super importante de entender. Isso significa que você tem uma configuração uniforme para o aplicativo inteiro, para todas as telas. Existem duas configurações: defaulttexto em preto sobre fundo branco ou lightContenttexto em branco sobre fundo preto.

Para configurar um deles ( uma configuração para todas as telas ):

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent // .default
    return true
}

Dessa forma, você não precisará restabelecer essa configuração em cada controlador de exibição. No entanto, você sempre pode recorrer a esse método para alterar voluntariamente a aparência.

Segunda abordagem - cor individual para cada controlador de exibição

Isto é o oposto. Para fazê-lo funcionar, vá para info.plist e defina

View controller-based status bar appearance

para SIM

Dessa forma, sempre que um novo controlador de exibição estiver aberto, o estilo da barra de status será definido individualmente se você inserir esta implementação em cada UIViewControllerinstância que precisar:

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

Você tem o mesmo que no primeiro, defina o estilo escuro ou claro para a barra de status, individual para cada controlador de exibição.

Esta propriedade é buscada pelo UIKit em dois cenários:

  1. Após a inicialização da tela, quando a interface do usuário está sendo preparada.
  2. Ao chamar setNeedsStatusBarAppearanceUpdate()o código.

Neste último caso, você está qualificado para manipular a aparência da barra de status pelo seguinte código:

var isDark = false {
    didSet {
        setNeedsStatusBarAppearanceUpdate()
    }
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return isDark ? .lightContent : .default
}

func toggleAppearance() {
   isDark.toggle()
}

Então, sempre que você ligar toggleAppearance(), a alteração no estilo da barra de status será acionada.

Terceira abordagem - Hack!

Há um hack que permite acessar a barra de status diretamente:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
    if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
        statusBar.backgroundColor = UIColor.blue
    }
    
    return true
}

Por que hackear? Se você precisar de uma cor da barra de status diferente de preto ou branco, use a API não documentada. Você obtém um statusBarobjeto usando o KVC e define sua cor de fundo. O objeto que você obtém dessa maneira é UIStatusBar, que é derivado UIViewe, portanto, suporta naturalmente a backgroundColorpropriedade. Essa é uma maneira suja, não legal, mas até agora é a única maneira de configurar cores personalizadas para a barra de status (sem levar em conta a UINavigationBarabordagem, que permite personalizar a aparência da barra de status + navbar + barra de status). Pode muito bem levar seu aplicativo a ser rejeitado. Mas talvez você tenha sorte. E se você estiver, em certas circunstâncias complexas (como hierarquia de controladores aninhados, navegação filho e exibição), essa pode ser a única, ou pelo menos a maneira menos problemática de personalizar a aparência da barra de status (por exemplo, para torná-la transparente)

Xcode 10+, Swift 4.2

Não há mais alternativas: o desenvolvedor deve permitir que cada controlador de exibição defina a aparência da barra de status, definindo o sinalizador como YES (ou omitindo essa ação, porque é YES por padrão) e seguindo as instruções acima.


Bônus

Solução baseada em hackers que você pode (embora não seja incentivado a) usar em circunstâncias complexas para alterar voluntariamente a aparência da barra de status a qualquer momento. Em termos de cores, o seguinte método de extensão faz exatamente o que você poderia ter feito com uma abordagem regular. Você pode ajustá-lo às suas necessidades.

extension UIViewController {
    func setStatusBarStyle(_ style: UIStatusBarStyle) {
        if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
            statusBar.backgroundColor = style == .lightContent ? UIColor.black : .white
            statusBar.setValue(style == .lightContent ? UIColor.white : .black, forKey: "foregroundColor")
        }
    }
}

2
Depois de ter a barra de status, você também pode fazer isso: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); ou use qualquer chave existente para definir qualquer propriedade que esteja disponível para UIStatusBar, mas não para UIView
— Marque

application.statusBarStyle = .lightContent Essa abordagem geralmente ocorre desde que o iOS9> Setter para 'statusBarStyle' foi preterido no iOS 9.0: Use - [UIViewController preferênciaStatusBarStyle] a espera é para UIViewController
— toxicsun

É o único que funciona aqui ao alterar o tema de cores do aplicativo. No entanto, parece que, uma vez definido, você sempre deve redefini-lo ao alternar os controladores de exibição. O método preferidoStatusBarStyle () é ignorado daqui em diante (mesmo com a configuração adequada em info.plist).
— Nontomatic 28/03/19

2
Esta resposta é mais descritiva em comparação com outras.
— ViruMax 5/09/19

2
Solução de bônus está quebrada no iOS 13.1
— ViruMax 17/09/19

130

Você pode tentar substituir o valor retornado, em vez de configurá-lo. O método é declarado como {get}, portanto, forneça um getter:

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Se você definir isso condicionalmente, precisará ligar setNeedsStatusBarAppearanceUpdate()para animar a alteração quando estiver pronto


2
Essa é uma abordagem melhor, pois você pode escolher prefersStatusBarHiddenalgumas das suas visualizações. Se você está indo com UIApplication.shared.statusBarStylevocê vai ficar preso a ele.
— Superarts.org

105

Swift 3 e 4, iOS 10 e 11, Xcode 9 e 10
Para mim, esse método não funciona:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

quando eu costumava a cada controlador de exibição, mas isso funcionou:

  • No arquivo info.list, adicione a linha: View controller-based status bar appearancee defina comoNO

  • Avançar no appdelegate:

    UIApplication.shared.statusBarStyle = .lightContent

Eu estava tentando apenas depois de adicionar o código ao delegado do aplicativo, mas a configuração do info plist foi útil para mim. Obrigado
— Akhilesh Sharma

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

33

Se você deseja alterar a statusBarcor do branco para branco, para todas as visualizações contidas em a UINavigationController, adicione-o dentro AppDelegate:

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

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

Este código:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

não trabalhar para UIViewControllerscontido em um UINavigationController, porque os olhares do compilador para o statusBarStyledo UINavigationController, não para o statusBarStyledo ViewControllerscontido por ela.

Espero que isso ajude aqueles que não tiveram sucesso com a resposta aceita!


Sim muito obrigado! O controlador de navegação era uma pequena nuance que muitos não consideravam!
— Alexis Candelaria

26

Se você quiser alterar o estilo da barra de status a qualquer momento após o aparecimento da exibição, use:

  • No arquivo info.list, adicione linha: visualize a aparência da barra de status baseada no controlador e defina-a como YES

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }

1
EIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
— Alexandre G

26

Xcode 10 ou posterior

Testado no Swift 5

Nenhum código necessário basta seguir as etapas abaixo.

Se você deseja alterar a barra de status em todo o aplicativo.

  1. Selecione Projeto no Project Navigator (painel do lado esquerdo).
  2. Selecione o destino.
  3. Selecione a guia Geral.
  4. Encontre informações de implantação.
  5. Altere o estilo da barra de status para Claro (para fundo escuro "Claro" , fundo claro "Padrão" )

Não se esqueça das alterações info.plist

  1. Guia Selecionar informações
  2. Adicione esta chave ao seu arquivo plist "Exibir aparência da barra de status baseada em controlador" = NÃO

Execute seu projeto e verifique-o.

Meu projeto no swift 5 e no Xcode 10.2 e 11.0


Para o Xcode 10 / Swift5, essa deve ser a resposta aceita. Você deve executar as duas etapas para que isso funcione.
— John Robi

Perfeito. Obrigado! Concordo que esta deve ser a resposta realmente aceita.
— DungeonDev

Esta é a resposta perfeita 🤟🏻
— nikhilgohil11

Isso funciona totalmente também para o xcode 11 com o swift 5, obrigado
— Luis Santiago

25

Você precisa adicionar a chave abaixo no seu arquivo Info.plist:

View controller-based status bar appearance com valor booleano definido como NO

Na sua classe appdelegate, no didFinishLaunchingWithOptionsmétodo antes do retorno.

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

mudança backgroundColore statusBarStyleconforme a exigência.


Solução agradável, mas isso conta como usar uma API privada?
— GoldenJoe

Funciona bem, mas como posso mudar para minha cor personalizada?
— iSrinivasan27

@MohanSrinivasan, em vez de "UIColor.red", você pode especificar sua cor personalizada.
— Himanshu PADIA

13

Você também pode fazer isso no storyboard

  1. Crie uma nova entrada no info.plist "Exibir aparência da barra de status baseada no controlador", defina-a como "SIM".
  2. Vá para o seu storyboard e selecione o controlador de navegação que deseja alterar. Clique na barra de navegação da seção de estrutura de tópicos do Storyboard (painel esquerdo no storyboard)
  3. Vá para o painel direito e clique na seção de atributos
  4. Na seção Barra de Navegação, você verá estilo. Selecione o estilo que você deseja (o padrão é preto e preto é branco)

Você precisará fazer isso para cada controlador de navegação que tiver. No entanto, quaisquer visualizações no controlador de navegação alterarão o estilo / cor de todas as barras de status da visualização para a que você acabou de selecionar. Acho essa opção melhor porque você pode ver seus resultados instantaneamente e não precisa adicionar linhas de código extras em todos os controladores de exibição.

insira a descrição da imagem aqui

(Feito com o Xcode 8.3.3 em um projeto all Swift)


"Ver estado aparência da barra baseada em controlador" deve definir como "NO"
— Willjay

2
Maneira muito limpa de definir o estilo da barra de status de acordo com o conteúdo do View Controller, que é a maneira correta, em vez de apenas definir View controller-based status bar appearance = NOe ter que usar apenas o estilo claro ou escuro em todo o aplicativo. É uma pena que esse modo "Codeless" funcione apenas no Navigation Controller, a Apple deve considerar adicionar outro campo para definir essa opção em qualquer instância do View Controller.
— precisa saber é o seguinte

12

Para pessoas que desejam alterar a barra de status para todos os controladores de exibição em: iOS 11, a solução Swfit 4/5 é bastante fácil.

1) Info.plist add:

Exibir a aparência da barra de status baseada em controlador -> NÃO

2) Lado esquerdo do projeto XCode slect> Destinos > Selecione seu projeto> Em Geral> Informações de Implantação> Selecionar Estilo da Barra de Status: Leve

Se você deseja alterar a barra de status apenas para um viewcontroller , em viewDidLoad, adicione:

2.1 ) Info.plist

Exibir aparência da barra de status baseada em controlador -> SIM

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Alteração de Objective-C (ou reagir nativo) do App Delegate:

1) Info.plist add:

Exibir a aparência da barra de status baseada em controlador -> NÃO

2) AppDelegate -> didFinishLaunchingWithOptions

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

Alterar a barra de status não funciona ao tentar fazer push (controladores de navegação), apenas na apresentação de controladores de exibição modal.


8

Primeiro passo, você precisa adicionar uma linha com a chave: View controller-based status bar appearancee o valor NOao Info.plistarquivo. Depois disso, adicione 2 funções no seu controlador para especificar apenas esse controlador:

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

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

6

Swift 3

No Info.plist, adicione uma linha chamada "Exibir aparência da barra de status baseada no controlador" e defina seu valor como No.

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

}

6

Parece haver um pequeno problema sobre a cor do texto da barra de status ao lidar com as barras de navegação.

Se você deseja que a entrada .plist Ver a aparência da barra de status baseada no controlador definida como YES, às vezes não funcionará quando você tiver uma barra de navegação colorida.

Por exemplo:

override func viewWillAppear(_ animated: Bool) {
    let nav = self.navigationController?.navigationBar
    nav?.barTintColor = .red
    nav?.tintColor = .white
    nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    setNeedsStatusBarAppearanceUpdate()
}

e

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

O código acima não funcionará, mesmo se você tiver definido o seguinte no AppDelegate:

UIApplication.shared.statusBarStyle = .lightContent

Para aqueles que ainda lutam, aparentemente de alguma forma julga se a barra de status precisa ser clara ou escura pelos estilos na barra de navegação. Portanto, consegui corrigir isso adicionando a seguinte linha no viewWillAppear:

nav?.barStyle = UIBarStyle.black

Quando o estilo da barra é preto, ele ouve sua variável substituída. Espero que isso ajude alguém :)


6

Para adicionar ao ótimo asnwer por @Krunal https://stackoverflow.com/a/49552326/4697535

Caso você esteja usando a UINavigationController, preferredStatusBarStyleisso não terá efeito no UIViewController.

Xcode 10 e Swift 4.

Definir um costume UINavigationController

Exemplo:

class LightNavigationController: UINavigationController {

   open override var preferredStatusBarStyle: UIStatusBarStyle {
       return .lightContent
   }
}

Use uma extensão para uma solução no nível do aplicativo:

extension UINavigationController {

  open override var preferredStatusBarStyle: UIStatusBarStyle {
      guard let index = tabBarController?.selectedIndex else { return .default }
      switch index {
      case 0, 1, 2: return .lightContent // set lightContent for tabs 0-2
      default: return .default // set dark for tab 3
      }
  }
}

5

Xcode 8.3.1, Swift 3.1

  1. Crie uma nova entrada no info.plist "Exibir aparência da barra de status baseada no controlador" e defina-a como "NÃO".

  2. Abra AppDelegate.swift e adicione essas linhas no método "didFinishLaunchingWithOptions":

application.statusBarStyle = .lightContent


5

Swift 4+

para texto branco da barra de status:

navigationController.navigationBar.barStyle = .blackTranslucent

5

Aqui estão as diretrizes / instruções da Apple sobre a alteração do estilo da barra de status.

Se você quiser definir o estilo de barra de status, nível de aplicação, em seguida, definir UIViewControllerBasedStatusBarAppearancea NOsua .plistarquivo. E no seu appdelegate> didFinishLaunchingWithOptionsadd following ine (programaticamente, você pode fazer isso a partir do aplicativo delegado).

Objetivo C

[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

Rápido

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}

se você deseja definir o estilo da barra de status, no nível do controlador de exibição, siga estas etapas:

  1. Defina UIViewControllerBasedStatusBarAppearancecomo YESno .plistarquivo, se você precisar definir o estilo da barra de status apenas no nível UIViewController.
  2. Na função de adição viewDidLoad - setNeedsStatusBarAppearanceUpdate

  3. substitua o preferidoStatusBarStyle no seu controlador de exibição.

Objetivo C

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

Rápido

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Defina o valor de .plist de acordo com o nível de configuração do estilo da barra de status.

insira a descrição da imagem aqui


4

Swift 4.0 Use este código em "didFinishLaunchingWithOptions launchOptions:" Appdelegate class

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

4

iOS 11.2

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

    UINavigationBar.appearance().barStyle = .black

    return true
}

'blackOpaque' está indisponível: Use UIStatusBarStyleLightContent
— Makalele

3

Isso funcionou para mim

Definir View controller-based status baraparência em NO in plist então In UIViewController viewDidAppearapenas adicionou a seguinte linha

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)

O setStatusBarStyle foi descontinuado no iOS 9.
— Lastmboy 15/11

3

rápido 3

se Exibir aparência da barra de status baseada no controlador = SIM no Info.plist

use essa extensão para todos os NavigationController

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

se não houver UINavigationController e tiver apenas UIViewController, use o código Abaixo:

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

2
Não funciona para mim. Eu recebo os erros "A propriedade não substitui nenhuma propriedade de sua superclasse" e "O Getter para 'selectedStatusBarStyle' com o seletor de Objective-C 'selectedStatusBarStyle' entra em conflito com a declaração anterior com o mesmo seletor de Objective-C".
— Theo

Obrigado por isso, após 20 tentativas diferentes e algumas combinações de itens para tentar, esta é a maneira de definir a cor da barra de status. Só lembrei de chamar setNeedsStatusBarAppearanceUpdate () quando quis mudar a cor, pois estava adicionando no modo noturno e o preto no preto simplesmente não estava funcionando.
— Stuart P.

3

Swift 5

Para adicionar mais detalhes à resposta do PRAVEEN em https://stackoverflow.com/a/40066798/2082851 , eu gostaria de fornecer minha implementação. Ele suporta a flexibilidade de personalizar a barra de status de cada controlador.

No geral, criaremos um BaseViewControllerque manipula a statusBarStylepropriedade em todos os casos. Ao criar um novo controlador, faça-o como subclasse desse controlador base.

Sempre que você quiser alterar a aparência do status, você só precisa atualizar esta propriedade. O estilo da barra de status será atualizado imediatamente.

Implementação

class BaseViewController: UIViewController {

    var statusBarStyle: UIStatusBarStyle = .default {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

Demo

class ViewController: BaseViewController, UIScrollViewDelegate {

    let scrollView = UIScrollView()
    ... 
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 30 {
                self.statusBarStyle = .darkContent
            } else {
                self.statusBarStyle = .lightContent
            }
        }
    }
}

insira a descrição da imagem aqui

2) UINavigationController

Pois UINavigationController, é um caso especial, no qual você pode seguir as seguintes soluções:

Solução A: substituir com envio de mensagem

Como UINavigationController é NSObjecte é herdado de ObjectiveC, seus métodos são message dispatche você pode substituí-los.

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

Solução B: Criar UINavigationControllersubclasse

Se você já possui um costume UINavigationController(que geralmente precisa controlar mais requisitos), esta é a melhor solução para você.

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}

2

Você pode usar uma propriedade bool chamada "shouldStatusBarDark" para alternar a cor da barra de status. E você também pode atualizar seu valor para alterar a cor da barra de status ao rolar.

 var shouldStatusBarDark = false {
     didSet {
         setNeedsStatusBarAppearanceUpdate()
     }
 }

 override var preferredStatusBarStyle: UIStatusBarStyle {
     return shouldStatusBarDark ? .default : .lightContent
 }

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
     let offSetY = scrollView.contentOffset.y
     if offSetY > 50 {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 1
             self.shouldStatusBarDark = true
         })
     } else {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 0
             self.shouldStatusBarDark = false
         })
     }
 }

o que é propriedade navView? obrigado por compartilhar sua solução
— medskill 13/11

1
@medskill O navView é apenas uma barra de navegação imitada adicionada programaticamente.
— Tiantong

2

A maioria dessas respostas é a mesma coisa re-hash, mas nenhuma delas realmente aborda a tela de inicialização para mim ao usar um fundo escuro.

Eu resolvi isso com o seguinte no meu, info.plistque produzia uma barra de status com estilo leve.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

2

Se você estiver recebendo o aviso: O configurador para 'statusBarStyle' foi descontinuado no iOS 9.0: Use - [UIViewController preferênciaStatusBarStyle] , para definir a barra de status como clara ou escura, use o seguinte código:

//To set the status bar to white
self.navigationController?.navigationBar.barStyle = .black //or .blackTranslucent

//To set the status bar to black
self.navigationController?.navigationBar.barStyle = .default

Isso não fará com que a sua barra de navegação seja alterada, apenas indica o estilo e, portanto, altera a barra de status de acordo.

NB. Você precisa garantir que você defina em seu info.plist.

View controller-based status bar appearance to YES

2

Se você estiver usando uma apresentação modal, precisará definir:

viewController.modalPresentationCapturesStatusBarAppearance = true

1

No iOS 13, você pode usar a .darkContent UIStatusBarStylepropriedade para exibir a barra de status escura


1

Se você ainda não conseguir alterar a base de estilo da barra de status no método

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Você pode tentar usar este método:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}

0

Para o objetivo C, basta adicionar esta linha no método didFinishLaunch da sua aplicação

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;

3
Isso foi preterido desde o iOS 9
— MK_Dev 04/10

0

usando o WebkitView

Swift 9.3 iOS 11.3

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!
    var hideStatusBar = true

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red

         webView.load(myRequest)

    }
}

extension UIApplication {

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

}

3
Swift 9.3? Ano errado, Marty
— Unidade iOS

Eu recomendo não usar a API privada para obter um "statusBar". A Apple faz alterações na API de tempos em tempos! E quando a apple altera a API, seu aplicativo pode falhar e não muda mais a barra de status. Isso fará com que você procure novamente por outra solução.
— Doci
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.