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?
Respostas:
[ATUALIZADO] Para Xcode 10+ e Swift 4.2+
Este é o método preferido para iOS 7 e superior
Nos aplicativos
Info.plist
, definaView controller-based status bar appearance
comoYES
.Substituir
preferredStatusBarStyle
( documentos da Apple ) em cada um dos seus controladores de exibição. Por exemplo:Se você tiver
preferredStatusBarStyle
retornado 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 chamarsetNeedsStatusBarAppearanceUpdate()
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
, definaView controller-based status bar appearance
comoNO
.No
appDelegate.swift
, adidFinishLaunchingWithOptions
função, adicione: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 appearance
aYES
em seus aplicativoinfo.plist
fonte
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 oulightContent
texto em branco sobre fundo preto.Para configurar um deles ( uma configuração para todas as telas ):
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: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:
setNeedsStatusBarAppearanceUpdate()
o código.Neste último caso, você está qualificado para manipular a aparência da barra de status pelo seguinte código:
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:
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 é derivadoUIView
e, portanto, suporta naturalmente abackgroundColor
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 aUINavigationBar
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.
fonte
Você pode tentar substituir o valor retornado, em vez de configurá-lo. O método é declarado como {get}, portanto, forneça um getter:
Se você definir isso condicionalmente, precisará ligar
setNeedsStatusBarAppearanceUpdate()
para animar a alteração quando estiver prontofonte
prefersStatusBarHidden
algumas das suas visualizações. Se você está indo comUIApplication.shared.statusBarStyle
você vai ficar preso a ele.Swift 3 e 4, iOS 10 e 11, Xcode 9 e 10
Para mim, esse método não funciona:
quando eu costumava a cada controlador de exibição, mas isso funcionou:
No arquivo info.list, adicione a linha:
View controller-based status bar appearance
e defina comoNO
Avançar no appdelegate:
fonte
Se você deseja alterar a
statusBar
cor do branco para branco, para todas as visualizações contidas em aUINavigationController
, adicione-o dentroAppDelegate
:Este código:
não trabalhar para
UIViewControllers
contido em umUINavigationController
, porque os olhares do compilador para ostatusBarStyle
doUINavigationController
, não para ostatusBarStyle
doViewControllers
contido por ela.Espero que isso ajude aqueles que não tiveram sucesso com a resposta aceita!
fonte
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
fonte
If you call this method within an animation block, the changes are animated along with the rest of the animation block.
Xcode 10 ou posterior
Testado no Swift 5
Nenhum código necessário basta seguir as etapas abaixo.
Não se esqueça das alterações info.plist
Execute seu projeto e verifique-o.
Meu projeto no swift 5 e no Xcode 10.2 e 11.0
fonte
Você precisa adicionar a chave abaixo no seu arquivo Info.plist:
View controller-based status bar appearance
com valor booleano definido comoNO
Na sua classe appdelegate, no
didFinishLaunchingWithOptions
método antes do retorno.mudança
backgroundColor
estatusBarStyle
conforme a exigência.fonte
Você também pode fazer isso no storyboard
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.
(Feito com o Xcode 8.3.3 em um projeto all Swift)
fonte
View controller-based status bar appearance = NO
e 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.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:
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
2.2 )
Alteração de Objective-C (ou reagir nativo) do App Delegate:
1) Info.plist add:
2) AppDelegate -> didFinishLaunchingWithOptions
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.
fonte
Primeiro passo, você precisa adicionar uma linha com a chave:
View controller-based status bar appearance
e o valorNO
aoInfo.plist
arquivo. Depois disso, adicione 2 funções no seu controlador para especificar apenas esse controlador:fonte
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
.fonte
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:
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 :)
fonte
Para adicionar ao ótimo asnwer por @Krunal https://stackoverflow.com/a/49552326/4697535
Caso você esteja usando a
UINavigationController
,preferredStatusBarStyle
isso não terá efeito noUIViewController
.Xcode 10 e Swift 4.
Definir um costume
UINavigationController
Exemplo:
Use uma extensão para uma solução no nível do aplicativo:
fonte
Xcode 8.3.1, Swift 3.1
Crie uma nova entrada no info.plist "Exibir aparência da barra de status baseada no controlador" e defina-a como "NÃO".
Abra AppDelegate.swift e adicione essas linhas no método "didFinishLaunchingWithOptions":
application.statusBarStyle = .lightContent
fonte
Swift 4+
para texto branco da barra de status:
fonte
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
UIViewControllerBasedStatusBarAppearance
aNO
sua.plist
arquivo. E no seuappdelegate
>didFinishLaunchingWithOptions
add following ine (programaticamente, você pode fazer isso a partir do aplicativo delegado).Objetivo C
Rápido
se você deseja definir o estilo da barra de status, no nível do controlador de exibição, siga estas etapas:
UIViewControllerBasedStatusBarAppearance
comoYES
no.plist
arquivo, se você precisar definir o estilo da barra de status apenas no nível UIViewController.Na função de adição viewDidLoad -
setNeedsStatusBarAppearanceUpdate
substitua o preferidoStatusBarStyle no seu controlador de exibição.
Objetivo C
Rápido
Defina o valor de .plist de acordo com o nível de configuração do estilo da barra de status.
fonte
Swift 4.0 Use este código em "didFinishLaunchingWithOptions launchOptions:" Appdelegate class
fonte
iOS 11.2
fonte
Isso funcionou para mim
Definir
View controller-based status bar
aparência em NO in plist então InUIViewController
viewDidAppear
apenas adicionou a seguinte linhafonte
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
se não houver UINavigationController e tiver apenas UIViewController, use o código Abaixo:
fonte
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
BaseViewController
que manipula astatusBarStyle
propriedade 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
Demo
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 é
NSObject
e é herdado deObjectiveC
, seus métodos sãomessage dispatch
e você pode substituí-los.Solução B: Criar
UINavigationController
subclasseSe você já possui um costume
UINavigationController
(que geralmente precisa controlar mais requisitos), esta é a melhor solução para você.fonte
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.
fonte
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.plist
que produzia uma barra de status com estilo leve.fonte
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:
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.
fonte
Se você estiver usando uma apresentação modal, precisará definir:
fonte
No iOS 13, você pode usar a
.darkContent
UIStatusBarStyle
propriedade para exibir a barra de status escurafonte
Se você ainda não conseguir alterar a base de estilo da barra de status no método
Você pode tentar usar este método:
fonte
Para o objetivo C, basta adicionar esta linha no método didFinishLaunch da sua aplicação
fonte
usando o WebkitView
Swift 9.3 iOS 11.3
fonte