Na minha aplicação do iPhone construído com Xcode 5 para iOS 7 I set UIViewControllerBasedStatusBarAppearance=YES
em info.plist
, e na minhaViewController
Eu tenho esse código:
-(UIStatusBarStyle) preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Mas a barra de status ainda está preta contra o fundo preto.
Eu sei que é possível mudar-wide aplicativo, fixando UIViewControllerBasedStatusBarAppearance=NO
em info.plist
, mas eu realmente preciso de alterar isso em um viewController
por viewController
base em tempo de execução.
iphone
ios7
xcode5
uistatusbar
Andrew Smith
fonte
fonte
Respostas:
Eu descobri que se o seu ViewController está dentro de um navigationController, o navigationController
navigationBar.barStyle
determina o statusBarStyle.Definir a barra de navegação
barStyle
paraUIBarStyleBlackTranslucent
fornecerá o texto da barra de status em branco (ou seja.UIStatusBarStyleLightContent
), EUIBarStyleDefault
fornecerá o texto da barra de status em preto (ou seja,UIStatusBarStyleDefault
).Observe que isso se aplica mesmo se você alterar totalmente a cor da barra de navegação por meio dela
barTintColor
.fonte
UINavigationController
'spreferredStatusBarStyle
não chama o ViewController que hospeda e, em vez disso, apenas retorna com base em seu navigationBarStyle.UIBarStyleBlackTranslucent
está obsoleto, use emUIBarStyleBlack
vez dissoOK, aqui está o truque. Você precisa adicionar a chave "Exibir barra de status baseada no controlador" e definir o valor como No.
Isso é contrário ao que parece ser o significado desta chave, mas mesmo se você definir o valor para
No
, ainda poderá alterar a aparência da barra de status e se ela é exibida ou não em qualquer controlador de visualização. Portanto, ele age como "Sim", mas defina como "Não"!Agora posso obter a barra de status branca ou escura.
fonte
Para
preferredStatusBarStyle()
trabalhar comUINavigationController
eUITabBarController
adiciono o código a seguir, que obterá o estilo de barra de status preferido do controlador de visualização atualmente visível.Para o Swift 3, esses não são métodos, mas propriedades:
As propriedades do Swift 4.2 foram renomeadas:
Uso
fonte
Posso estar chegando lá um pouco tarde, mas caso alguém esteja procurando por uma solução funcional e verificada para o aplicativo.
@mxcl está correto ao descrever por que isso está acontecendo. Para corrigir isso, simplesmente criamos uma extensão (ou categoria em obj-c) que substitui o método preferredSatusBarStyle () de UINavigationController. Aqui está um exemplo em Swift:
Este código simplesmente extrai o primeiro controlador de visão (o controlador de visão raiz) e o desembrulha (em obj-c, verifique se ele não é nulo). Se o desempacotamento for bem-sucedido (não nulo), pegamos o rootViewControllers preferredStatusBarStyle. Caso contrário, apenas retornamos o padrão.
Espero que isso ajude alguém que possa precisar.
fonte
return self.preferredStatusBarStyle()
chamaria de volta neste mesmo método.visibleViewController
seria ainda melhorPara fornecer mais detalhes sobre a resposta aceita, coloque a seguinte linha no
didFinishLaunchingWithOptions:
método do delegado do aplicativo :Em seguida, em seu Info.plist, adicione
View controller-based status bar appearance
e defina comoNO
.Eu acredito que é assim que deve ser feito, NÃO a partir do controlador de navegação, se você quiser a mesma cor da barra de status para todo o aplicativo. Você pode ter telas que não estão necessariamente embutidas em uma
UINavigationController
, ou em umaUINavigationController
subclasse diferente em outro lugar, e outras coisas.EDIT : Você também pode fazer isso sem digitar nenhum código: https://stackoverflow.com/a/18732865/855680
fonte
Em viewDidLoad basta escrever isso
apenas faça isso e vai funcionar
você pode tentar isso?
Mais uma coisa que vi em sua pergunta, que você escreveu o método como este
mas deveria ser assim
fonte
[self setNeedsStatusBarAppearanceUpdate];
um método tão bom, obrigado!Aqui está como eu resolvi isso. Normalmente o navigationController ou tabBarController são os que decidem a aparência da barra de status (oculto, cor, etc).
Então, acabei criando uma subclasse do controlador de navegação e substituindo preferredStatusBarStyle. se o atual ViewContorller visível implementa StatusBarStyleHandler, eu peço que o valor seja usado como o estilo, se não, eu apenas retorno um valor padrão.
A maneira como você dispara uma atualização da aparência da barra de status é chamando
setNeedsStatusBarAppearanceUpdate
qual disparapreferredStatusBarStyle
novamente e atualiza a IU de acordo com o que o método retornaEntão uso
fonte
1) Uma configuração para todo o projeto:
Se disponível, remova o
UIViewControllerBasedStatusBarAppearance
par de valores-chave de seu info.plist ou definaNO
sem removê-lo. Se não estiver disponível em seu info.plist, não faça nada. O padrão éNO
para esta propriedade.Adicione o código abaixo ao seu AppDelegate.m:
2) Configurações diferentes para controladores de visualização diferentes:
Adicione
UIViewControllerBasedStatusBarAppearance
um par de valores-chave ao seu info.plist e defina-o comoYES
.Se o seu View Controller não estiver incorporado ao Navigation Controller. Digamos MyViewController. basta adicionar o código abaixo ao seu arquivo MyViewController.m. Se o seu View Controller estiver embutido no Navigation Controller, crie uma nova Cocoa Touch Class e torne-a uma subclasse de UINavigationController. Digamos MyNC. Selecione Navigation Controller View em seu Storyboard, no painel direito; Utilitários -> Inspetor de identidade -> Classe personalizada -> Classe, digite "MyNC". Depois de vincular o Storyboard View à sua classe Cocoa Touch "MyNC", adicione o código abaixo ao seu MyNC.m:
fonte
Mesmo com todas as respostas aqui ainda não achei a solução exata para mim, mas comecei com a resposta do Daniel. O que eu terminei foi:
em controladores de navegação (semelhante para tab, apenas selectedViewController). E então respeitará:
Em cada controlador de visualização, a menos que você defina de outra forma. Eu não preciso ligar para
setNeedsStatusBarAppearanceUpdate()
lugar nenhum, ele apenas atualiza quando você chega em cada controlador de visualização.fonte
Solução (ões) iOS 13
A resposta com maior votação usa código "legado" 👎
A configuração da
barStyle
propriedade agora (iOS 13+) é considerada uma "personalização legada". De acordo com a Apple ,Em relação à sua tentativa - Você estava no caminho certo!
UINavigationController
é uma subclasse deUIViewController
(quem diria 🙃)!Portanto, ao apresentar controladores de visualização embutidos em controladores de navegação, você não está realmente apresentando os controladores de visualização embutidos; você está apresentando os controladores de navegação!
UINavigationController
, como uma subclasse deUIViewController
, herdapreferredStatusBarStyle
echildForStatusBarStyle
, que você pode definir conforme desejado.Qualquer um dos seguintes métodos deve funcionar:
Substituir
preferredStatusBarStyle
emUINavigationController
preferredStatusBarStyle
( doc ) - O estilo de barra de status preferido para o controlador de visualizaçãoSubclasse ou extensão
UINavigationController
OU
Substituir
childForStatusBarStyle
emUINavigationController
childForStatusBarStyle
( doc ) - Chamado quando o sistema precisa do controlador de visualização para usar para determinar o estilo da barra de statusSubclasse ou extensão
UINavigationController
OU
Você pode retornar qualquer controlador de visualização que desejar acima. Eu recomendo um dos seguintes:
topViewController
(ofUINavigationController
) ( doc ) - O controlador de visualização no topo da pilha de navegaçãovisibleViewController
(ofUINavigationController
) ( doc ) - O controlador de visualização associado à visualização atualmente visível na interface de navegação (dica: isso pode incluir "um controlador de visualização que foi apresentado modalmente em cima do próprio controlador de navegação")Nota: Se você decidir criar uma subclasse
UINavigationController
, lembre-se de aplicar essa classe aos seus controladores de navegação por meio do inspetor de identidade no IB.PS Meu código usa a sintaxe Swift 5.1 😎
fonte
.default
estilo leva em consideração o modo escuro e não é documentado, então se você também oferece suporte a versões anteriores do iOS, pode adicionarif #available(iOS 13, *) { return .darkContent } else { return .default }
se estiver tentando configurar o estilo da barra de status manualmente de acordo com o atrás da barra de status e essa cor é "brilhante".Se você quiser ocultar o statusBar durante splashScreen, mas quiser alterar o estilo para conteúdo claro (StatusBarInitiallyHidden no Plist deve ser NÃO para ocultar o statusBar no splash), você pode adicionar isso ao método didFinishLaunchingWithOptions do appDelegate para alterar para lightContent.
fonte
exemplo rápido
em AppDelegate.swift
in info.plist set Ver aparência da barra de status baseada no controlador: NÃO
fonte
Se você estiver usando
NavigationController
, você pode criarNavigationController
uma subclasse para que consulte seu controlador de visualização filho// MyCustomNavigationController
fonte
Swift 4.2
fonte
Você pode definir o estilo da barra de status. Ele se parecerá com a barra de status como IOS 6 e abaixo.
Cole estes métodos em seu controlador de visualização
e chamar este método a partir da visualização carregou assim
fonte
[self setStatusBarNeedsUpdate]
no segundo bloco? (Ou algo mais, pelo menos).Só quero adicionar uma nota para um caso específico que enfrentei. Eu tinha outra UIWindow em meu aplicativo para exibir um chat flutuando em todo o meu aplicativo o tempo todo. Fazer isso não fez com que nenhuma das soluções acima funcionasse, e não tenho certeza do motivo! Tudo o que notei é que meu ViewController na nova UIWindow era a razão para isso! E se eu quiser mudar o estilo da barra de status, tenho que fazer isso naquele controlador de visualização da nova UIWindow.
Esta nota pode ajudar outras pessoas que tenham uma estrutura semelhante! Basicamente, você pode aplicar as soluções mencionadas acima no ViewController da nova UIWindow.
Novamente, este é um caso específico.
obrigado
fonte
Para swift 3, em seu UIViewController:
fonte