No iOS 7, UIStatusBar
ele foi projetado de uma maneira que se funde com a visualização da seguinte maneira:
(GUI projetada por Tina Tavčar )
É legal, mas atrapalha um pouco a sua exibição quando você tem algo na parte superior da tela e fica sobreposto à barra de status.
Existe uma solução simples (como definir uma propriedade em info.plist) que possa mudar a maneira como ela funciona [sem se sobrepor] de volta a como está no iOS6?
Eu sei que uma solução mais direta é ter
self.view.center.x
+ 20 pontos para cada controlador de exibição, mas alterá-los estragará outras dimensões (ter um diferenteself.view.center.x
pode causar problemas para sequências personalizadas, etc.) e, de repente, ele se transforma em um trabalho tedioso. melhor ser evitado.Ficarei realmente feliz se alguém puder me fornecer uma solução unilateral para isso.
PS Eu sei que posso ocultar a barra de status fazendo coisas como ter
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
No didFinishLaunchingWithOptions
método, mas isso é uma solução alternativa, um atalho para evitar o problema, por isso não considero isso uma solução real.
UIStatusBarDefault
para a barra de status apenas torna seu conteúdo preto na cor. Não fará com que ela funcione de volta ao modo como está no iOS6.Respostas:
Isso é postado cruzadamente em uma postagem de blog que escrevi , mas aqui está o resumo completo das barras de status, barras de navegação e controladores de exibição de contêiner no iOS 7:
Não há como preservar o layout da barra de status no estilo do iOS 6. A barra de status sempre se sobrepõe ao seu aplicativo no iOS 7
Não confunda a aparência da barra de status com o layout da barra de status. A aparência (clara ou padrão) não afeta o layout da barra de status (quadro / altura / sobreposição). É importante observar também que a barra de status do sistema não possui mais cor de fundo. Quando a API se refere a UIStatusBarStyleLightContent, elas significam texto em branco em um plano de fundo claro. UIStatusBarStyleDefault é texto em preto em um plano de fundo claro.
A aparência da barra de status é controlada por um dos dois caminhos básicos mutuamente exclusivos: você pode defini-los programaticamente da maneira tradicional ou o UIKit atualizará a aparência para você com base em algumas novas propriedades do UIViewController. A última opção está ativada por padrão. Verifique o valor essencial do seu aplicativo em "Aparência da barra de status com base no ViewController" para ver qual deles você está usando. Se você definir esse valor como YES, todos os controladores de exibição de nível superior em seu aplicativo (exceto um controlador de exibição de contêiner UIKit padrão) precisarão substituir o preferidoStatusBarStyle, retornando o estilo padrão ou o estilo leve. Se você editar o valor plist para NO, poderá gerenciar a aparência da barra de status usando os métodos familiares do UIApplication.
O UINavigationController alterará a altura do seu UINavigationBar para 44 ou 64 pontos, dependendo de um conjunto de restrições bastante estranho e não documentado. Se o UINavigationController detectar que a parte superior do quadro da visualização é visualmente contígua à parte superior do UIWindow, ele desenha sua barra de navegação com uma altura de 64 pontos. Se o topo de sua exibição não for contíguo ao topo do UIWindow (mesmo que desapareça apenas um ponto), ele desenha sua barra de navegação da maneira “tradicional”, com uma altura de 44 pontos. Essa lógica é executada pelo UINavigationController, mesmo que haja vários filhos dentro da hierarquia do controlador de exibição do seu aplicativo. Não há como impedir esse comportamento.
Se você fornecer uma imagem de plano de fundo da barra de navegação personalizada com apenas 44 pontos (88 pixels) de altura e os limites da visualização do UINavigationController corresponderem aos limites da UIWindow (conforme discutido em # 4), o UINavigationController desenhará sua imagem no quadro (0,20,320 , 44), deixando 20 pontos de espaço em preto opaco acima da sua imagem personalizada. Isso pode confundi-lo ao pensar que você é um desenvolvedor inteligente que ignorou a regra 1, mas você está enganado. A barra de navegação ainda tem 64 pontos de altura. A incorporação de um UINavigationController em uma hierarquia de exibição de estilo slide-a-revelador deixa isso bem claro.
Cuidado com a propriedade edgeForExtendedLayout de UIViewController de nome confuso. Ajustar edgeForExtendedLayout não faz nada na maioria dos casos. A única maneira pela qual o UIKit usa essa propriedade é se você adicionar um controlador de exibição a um UINavigationController, e o UINavigationController usar edgeForExtendedLayout para determinar se o controlador de exibição filho deve ou não estar visível embaixo da área da barra de navegação / barra de status. A configuração de edgeForExtendedLayout no UINavigationController não faz nada para alterar se o UINavigationController tem ou não uma área de barra de navegação com 44 ou 64 pontos de altura. Veja o item 4 para essa lógica. Uma lógica de layout semelhante se aplica à parte inferior da sua exibição ao usar uma barra de ferramentas ou UITabBarController.
Se tudo o que você está tentando fazer é impedir que seu controlador de exibição filho personalizado fique sobre a barra de navegação quando estiver dentro de um UINavigationController, defina edgeForExtendedLayout como UIRectEdgeNone (ou pelo menos uma máscara que exclua UIRectEdgeTop). Defina esse valor o mais cedo possível no ciclo de vida do seu controlador de exibição.
O UINavigationController e o UITabBarController também tentarão preencher os contentInsets dos modos de exibição de tabela e de coleção em sua hierarquia de subvisões. Isso é feito de maneira semelhante à lógica da barra de status do item 4. Existe uma maneira programática de evitar isso, definindo automaticamenteAdjustsScrollViewInsets como NO para suas visualizações de tabela e de coleção (o padrão é YES). Isso apresentou alguns problemas sérios para o Whisper e o Riposte, pois usamos os ajustes contentInset para controlar o layout das visualizações da tabela em resposta aos movimentos da barra de ferramentas e do teclado.
Para reiterar: não há como retornar à lógica de layout da barra de status no estilo do iOS 6. Para aproximar isso, é necessário mover todos os controladores de exibição do seu aplicativo para uma exibição de contêiner que é deslocada em 20 pontos a partir da parte superior da tela, deixando uma exibição intencionalmente preta atrás da barra de status para simular a aparência antiga. Esse é o método que acabamos usando no Riposte e no Whisper.
A Apple está se esforçando muito para garantir que você não tente fazer o # 9. Eles querem que redesenhamos todos os nossos aplicativos para sobrepor a barra de status. Existem muitos argumentos convincentes, no entanto, tanto pela experiência do usuário quanto por razões técnicas, por que nem sempre é uma boa idéia. Você deve fazer o melhor para seus usuários e não simplesmente seguir o capricho da plataforma.
fonte
Aparentemente, não há como reverter a barra de status do iOS7 para como ela funciona no iOS6.
No entanto, sempre podemos escrever alguns códigos e transformar a barra de status no estilo iOS6, e esta é a maneira mais rápida de obter:
Defina
UIViewControllerBasedStatusBarAppearance
comoNO
ininfo.plist
(para optar por não permitir que os controladores de exibição ajustem o estilo da barra de status para que possamos definir o estilo da barra de status usando o método UIApplicationstatusBarStyle.)No AppDelegate
application:didFinishLaunchingWithOptions
, ligue paraa fim de:
Verifique se é o iOS 7.
Defina o conteúdo da barra de status como branco, em oposição a UIStatusBarStyleDefault.
Evite a exibição de subvisões cujos quadros ultrapassem os limites visíveis (para vistas que animam na vista principal de cima).
Crie a ilusão de que a barra de status ocupa espaço como no iOS 6, deslocando e redimensionando a moldura da janela do aplicativo.
Para aplicativos com rotação de tela,
use o NSNotificationCenter para detectar alterações de orientação adicionando
em
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
e criar um novo método em AppDelegate:Para que, quando a orientação for alterada, ele acionará uma instrução de chave para detectar a orientação da tela do aplicativo (Retrato, De cabeça para baixo, Paisagem à esquerda ou Paisagem à direita) e alterar o quadro da janela do aplicativo, respectivamente, para criar a ilusão da barra de status do iOS 6.
Para alterar a cor de fundo da sua barra de status:
Adicionar
em
AppDelegate.h
fazerbackground
uma propriedade em sua classe e evitar ARC de retirar a atribuição-lo. (Você não precisa fazer isso se não estiver usando o ARC.)Depois disso, você só precisa criar o UIWindow em
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
:Não se esqueça de
@synthesize background;
depois@implementation AppDelegate
!fonte
Resolvi o problema com o seguinte código. Isto é para adicionar uma barra de status. didFinishLaunchingWithOptionsE para o Interface Builder, isso é para quando você abre com o iOS 6; está começando em 0 pixels.Nota: O iOS 6/7 Deltas será exibido apenas se você desmarcar "Usar Autolayout" para o View Controller no "File Inspector" (ícone à esquerda) no painel de detalhes.fonte
SOLUÇÃO:
Defina-o no seu viewcontroller ou no rootviewcontroller substituindo o método:
fonte
Aqui está outra abordagem para projetos que fazem uso extensivo do Storyboard:
OBJETIVO:
O objetivo dessa abordagem é recriar o mesmo estilo da barra de status no iOS7 que existia no iOS6 (consulte o título da pergunta "Barra de status do iOS 7 Voltar ao estilo do iOS 6?").
RESUMO:
Para conseguir isso, usamos o Storyboard, tanto quanto possível, deslocando os elementos da interface do usuário que são sobrepostos pela barra de status (no iOS 7) para baixo, enquanto usamos deltas para reverter a alteração de layout para baixo no iOS 6.1 ou anterior. O espaço extra resultante no iOS 7 é então ocupado por um UIView com o backgroundColor definido como uma cor de nossa escolha. O último pode ser criado em código ou usando o Storyboard (consulte ALTERNATIVES abaixo)
PREMISSAS:
Para obter o resultado desejado ao seguir as etapas abaixo, supõe-se que
View controller-based status bar appearance
esteja definido como NÃO e que vocêStatus bar style
esteja definido como "Estilo preto transparente (alfa de 0,5)" ou "Estilo preto opaco". Ambas as configurações podem ser encontradas / ou adicionadas em "Informações" nas configurações do seu projeto.PASSOS:
Adicione uma subvisão ao UIWindow para servir como plano de fundo da barra de status. Para conseguir isso, adicione o seguinte ao AppDelegate
application: didFinishLaunchingWithOptions:
apósmakeKeyAndVisible
Como você adicionou programaticamente um plano de fundo apenas para o iOS 7, será necessário ajustar o layout dos elementos da interface do usuário que se sobrepõem à barra de status, preservando o layout para o iOS6. Para conseguir isso, faça o seguinte:
Use Autolayout
se a opção Desmarcado está desmarcada (porque, caso contrário, "iOS 6/7 Deltas" não é mostrado no Inspetor de tamanhos). Para fazer isso:ALTERNATIVAS:
Para adicionar ainda menos código em projetos pesados de storyboard e ter a auto-rotação do segundo plano da barra de status, em vez de adicionar um segundo plano programaticamente à sua barra de status, você pode adicionar uma visualização colorida a cada controlador de visualização localizado na parte superior da visualização principal do referido controlador de visualização. Em seguida, você alteraria o delta da altura dessa nova visualização para o mesmo valor negativo que a altura da sua visualização (para desaparecer no iOS 6).
A desvantagem dessa alternativa (embora talvez insignificante, considerando a compatibilidade da autorotação) é o fato de que essa visualização extra não é imediatamente visível se você estiver visualizando o Storyboard para iOS 6. Você só saberia que ela existe se você desse uma olhada no " Resumo do documento "do Storyboard.
fonte
Se você não deseja que seus controladores de exibição sejam sobrepostos pela barra de status (e pelas barras de navegação), desmarque a caixa "Estender arestas sob as barras superiores" no Interface Builder no Xcode 5.
fonte
A Apple lançou as Perguntas e respostas técnicas QA1797: Impedindo que a barra de status cubra suas visualizações . Funciona bem para as versões iOS 6 e iOS 7.
fonte
Eu já vi muitos, muitos, muitos e muitos tutoriais para corrigir esse problema. Mas nenhum deles funciona! Aqui está a minha solução e funciona para mim:
A lógica é simples. Eu mudo todas as visões de crianças no self.view com 20 pixels. Isso é tudo. Em seguida, a captura de tela será exibida exatamente como o iOS 6. Eu odeio a barra de status do iOS7! ~ "~
fonte
Uma pequena alternativa à resposta de Archy Holt, um pouco mais simples:
uma. Defina
UIViewControllerBasedStatusBarAppearance
comoNO
em info.plistb. Em
AppDelegate
'sapplication:didFinishLaunchingWithOptions:
, chamada:E adicione o método:
Você também pode considerar a subclasse
UIWindow
para se auto -manipularUIApplicationDidChangeStatusBarOrientationNotification
.fonte
Eu usei isso em todos os meus controladores de exibição, é simples. Adicione essas linhas em todos os seus métodos viewDidLoad:
fonte
Tente este método simples ....
Etapa 1 : alterar em um único
viewController
Etapa 2 : alterar em todo o aplicativo
Etapa 3 : adicione isso em cada um
viewWillAppear
para ajustar astatusbar
altura paraiOS7
fonte
Há uma opção no Interface Builder que chama a propriedade Delta iOS 6/7, que visa solucionar o problema de deslocamento.
Dê uma olhada na pergunta Stack Overflow Interface Interface: Para que servem os deltas do iOS 6/7 de layout do UIView? .
fonte
Atingi a barra de status como o iOS 6 no iOS 7.
Defina UIViewControllerBasedStatusBarAppearance como NO em info.plist
Coloque este código no
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
métodoPode empurrar para baixo todas as suas visualizações em 20 pixels.Para mais, use o seguinte código no
-(void)viewDidAppear:(BOOL)animated
métodoVocê deve definir o valor windowHeight Userdefaults após a alocação da janela no método didFinishLauncing, como
fonte
height
igual a 64 em vez de 44. Em seguida, sua barra se estenderá até o topo, como nos aplicativos da Apple.Se você estiver usando o construtor de interface, tente o seguinte:
No seu arquivo xib:
1) Selecione a vista principal, defina a cor do plano de fundo para preto (ou qualquer cor que você deseja que a barra de status seja
2) Verifique se o plano de fundo é uma subvisão independente, posicionada como um filho de nível superior da visualização do controlador.
Mova seu plano de fundo para se tornar um filho direto da visão do controlador. Verifique o painel de dimensionamento automático para garantir que você bloqueou todas as arestas do quadro, ativou os dois eixos de flexibilidade e, se for um UIImageView, defina o modo de conteúdo como Escala para preencher. Programaticamente, isso se traduz em contentMode definido como UIViewContentModeScaleToFill e tem sua máscara de redimensionamento automático definida como (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight).
3) Agora mova tudo o que está bloqueado de cima para baixo em 20 pts e defina um delta do iOS 6/7 para Y -20.
Todos os filhos de nível superior que estão bloqueados no quadro superior no painel de dimensionamento automático precisam ser movidos para baixo em 20pts e ter o delta do iOS 6/7 em Y definido para -20. (Cmd selecione todos esses itens e clique na seta para baixo 20 vezes - existe uma maneira melhor de alguém?)
4) Ajuste a altura delta do iOS 6/7 de todos os itens acima que tinham uma altura flexível. Qualquer um dos itens bloqueados na parte superior e inferior do quadro e com a altura flexível ativada no painel de dimensionamento automático também deve ter a altura delta do iOS 6/7 definida como 20. Isso inclui a exibição de plano de fundo mencionada acima. Isso pode parecer anti-intuitivo, mas devido à ordem em que eles são aplicados, é necessário. A altura do quadro é definida primeiro (com base no dispositivo), depois os deltas são aplicados e, finalmente, as máscaras de dimensionamento automático são aplicadas com base nas posições de deslocamento de todos os quadros filhos - pense um pouco sobre isso, fará sentido.
5) Finalmente, os itens que foram bloqueados no quadro inferior, mas não no quadro superior, não precisam de deltas.
Isso fornecerá a barra de status idêntica no iOS7 e iOS6.
Por outro lado, se você deseja estilizar o iOS7 enquanto mantém a compatibilidade com o iOS6, defina os valores delta Y / delta height como 0 para a visualização em segundo plano.
Para ver mais informações sobre a migração do iOS7, leia a publicação completa: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html
fonte
Minha solução foi adicionar um
UIView
com altura de 20 pontos no topo da janela quando no iOS 7. Então eu criei um método na minha classe AppDelegate para exibir / ocultar a fundo barra de status "sólida". Emapplication:didFinishLaunchingWithOptions:
:Então eu criei um método para desvanecer / desabilitar o fundo preto da barra de status:
Tudo o que tenho a fazer agora é ligar
[appDelegate showSolidStatusBar:YES]
quando necessário.fonte
Esse pode ser um problema esmagador se você usar o layout Automático porque não poderá mais manipular quadros diretamente. Existe uma solução simples sem muito trabalho.
Acabei escrevendo um método utilitário em uma classe Utility e o chamei de todos os
viewDidLayoutSubviews
métodos dos controladores de exibição .Substitua seu
viewDidLayoutSubviews
método no controlador de exibição, onde deseja a barra de status. Isso o levará ao fardo do Autolayout.fonte
A maneira mais fácil de fazer isso é instalar um SDK mais antigo no seu mais novo Xcode.
Como instalar o SDK mais antigo no Xcode mais recente?
Você pode obter o SDK do iOS 6.1 em http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html ou fazer o download de um Xcode mais antigo e obter o SDK de seu conteúdo
Descompacte e cole esta pasta em /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
Reinicie o xcode.
Espero que ajude você. Funcionou para mim =)
fonte
Ao usar a
presentViewController:animated:completion:
bagunçawindow.rootViewController.view
, tive que encontrar uma abordagem diferente para esse problema. Finalmente consegui trabalhar com modais e rotações subclassificando a UIView do meu rootViewController..h
.m
Agora você tem uma forte solução alternativa para animações do iOS7.
fonte
Estou atrasado para esta resposta, mas só quero compartilhar o que fiz, que é basicamente a solução mais fácil
Primeiro de tudo-> Vá para o seu
info.plist
arquivo e adicione Estilo da barra de status-> Estilo preto transparente (Alfa de 0,5)Agora, aqui vai: -
Adicione este código no seu AppDelegate.m
fonte
Minha solução muito simples (supondo que você tenha apenas orientação vertical suportada) é redefinir os limites da janela do aplicativo para versões do iOS abaixo de 7, no delegado do aplicativo, método didFinishLaunchingWithOptions:
fonte
Você pode ocultar a barra de status todos juntos. Portanto, seu aplicativo será exibido em tela cheia. Eu acho que é o melhor que você terá.
UIStatusBarStyleNone
ou definido nas configurações de destino.fonte
Etapas para ocultar a barra de status no iOS 7:
1. Acesse o arquivo info.plist do aplicativo.
2.E definir, exibir a aparência da barra de status baseada em controlador: Booleano NÃO
Espero ter resolvido o problema da barra de status .....
fonte
Para continuar trabalhando com setStatusBarHidden: eu uso esta categoria:
fonte
Encontrei aqui as melhores alternativas e soluções para esse problema da barra de navegação no iOS7 !!
http://www.appcoda.com/customize-navigation-status-bar-ios-7/
Espero que isso esclareça todas as nossas dúvidas e preocupações.
fonte
Pode ser tarde demais para compartilhar, mas tenho algo a contribuir que pode ajudar alguém. Estava tentando subclassificar o UINavigationBar e queria fazer com que parecesse o ios 6 com barra de status preta e texto da barra de status em branco.
Aqui está o que eu achei trabalhando para isso
Tornou o fundo da barra de status preto, o texto da barra de status em branco e a cor da barra de navegação em branco.
iOS 9.3, XCode 7.3.1
fonte