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?

Willjay
fonte
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
   }
}
PRAVEEN
fonte
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")
        }
    }
}
Hexfire
fonte
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

Abizern
fonte
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
Gracu
fonte
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!

Mr. Xcoder
fonte
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 
        } 
    }
alex de oliveira
fonte
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

Vivek
fonte
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.

Himanshu padia
fonte
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)

Bryan Norden
fonte
"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.

Doci
fonte
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    
}
javimuu
fonte
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()

    }

}
youareawaitress
fonte
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 :)

nCr78
fonte
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
      }
  }
}
Tal Zion
fonte
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

joemalski
fonte
5

Swift 4+

para texto branco da barra de status:

navigationController.navigationBar.barStyle = .blackTranslucent
Alfi
fonte
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

Krunal
fonte
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
}
Karthickkck
fonte
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
}
Satish Babariya
fonte
'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)
Anshad Rasheed
fonte
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
         }
     }
Datt Patel
fonte
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
    }
}
nahung89
fonte
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
         })
     }
 }
tiantong
fonte
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>
CodeBender
fonte
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
Richard Hope
fonte
2

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

viewController.modalPresentationCapturesStatusBarAppearance = true
RomanMisnikov
fonte
1

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

Hubert Fabisiak
fonte
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
}
Jin
fonte
0

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

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
Asfand Shabbir
fonte
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
    }

}
Homem Oracular
fonte
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