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.info
prá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: default
texto em preto sobre fundo branco ou lightContent
texto 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 UIViewController
instâ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:
- Após a inicialização da tela, quando a interface do usuário está sendo preparada.
- 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 statusBar
objeto usando o KVC e define sua cor de fundo. O objeto que você obtém dessa maneira é UIStatusBar
, que é derivado UIView
e, portanto, suporta naturalmente a backgroundColor
propriedade. 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 UINavigationBar
abordagem, 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")
}
}
}