Jared Sinclair.
Wrestling com barras de status e barras de navegação no iOS 7.
Ao atualizar o Riposte e o Whisper para o iOS 7, um dos problemas recorrentes que tive era obter nossa hierarquia de visão para o layout corretamente. As APIs mais problemáticas são aquelas para a barra de status do sistema e UINavigationController. A documentação da API é lamentavelmente inadequada a partir desta escrita. O que se segue é, no meu melhor conhecimento, informações essenciais para qualquer desenvolvedor que esteja lutando com barras de status e veja a contenção do controlador no iOS 7:
Não há como preservar o layout da barra de status do estilo iOS 6. A barra de status sempre se sobrepõe à sua aplicação no iOS 7.
Não confunda a aparência da barra de status com o layout da barra de status. A aparência (luz ou padrão) não afeta a forma como a barra de status é definida (quadro / altura / sobreposição). É importante notar também que a barra de status do sistema não possui mais nenhuma cor de fundo. Quando a API se refere a UIStatusBarStyleLightContent, eles significam texto branco em um plano de fundo claro. UIStatusBarStyleDefault é texto preto em um fundo claro.
A aparência da barra de status é controlada ao longo de um dos dois caminhos de base mutuamente exclusivos: você pode configurá-los de forma programática da maneira tradicional, ou UIKit atualizará a aparência para você com base em novas propriedades do UIViewController. A última opção está ativada por padrão. Verifique o valor do seu aplicativo para o & ldquo; ViewController-Based Status Bar Aparência & rdquo; para ver qual deles você está usando. Se você definir esse valor como SIM, todos os controles de exibição de nível superior em seu aplicativo (além de um controlador de exibição de contêiner UIKit padrão) devem substituir preferredStatusBarStyle, retornando o padrão ou o estilo leve. Se você editar o valor plist para NO, então você pode gerenciar a aparência da barra de status usando os métodos familiares de UIApplication.
O UINavigationController alterará a altura de seu UINavigationBar para 44 pontos ou 64 pontos, dependendo de um conjunto de restrições bastante estranho e indocumentado. Se o UINavigationController detecta que a parte superior do quadro da sua visão é visualmente contígua com a parte superior da sua UIWindow & rsquo; s, ela desenha sua barra de navegação com uma altura de 64 pontos. Se o topo da sua exibição não for contíguo com o topo da UIWindow (mesmo que desligado por apenas um ponto), ele desenha sua barra de navegação no & ldquo; tradicional & rdquo; com uma altura de 44 pontos. Essa lógica é executada pelo UINavigationController, mesmo que sejam várias crianças dentro da hierarquia do controlador de exibição de sua aplicação. Não há como evitar esse comportamento.
Se você fornecer uma imagem de plano de fundo de barra de navegação personalizada que tenha apenas 44 pontos (88 pixels) de altura, e os limites de exibição & rsquo; s de UservigationController & rsquo; coincidem com os limites de UIWindow & rsquo; (conforme discutido em # 4), o UINavigationController desenhará sua imagem em o quadro (0,20,320,44), deixando 20 pontos de espaço preto opaco acima da sua imagem personalizada. Isso pode confundi-lo em pensar que você é um desenvolvedor inteligente que ignorou a regra 1, mas está enganado. A barra de navegação ainda tem 64 pontos de altura. Incorporar um UINavigationController em uma hierarquia de exibição de estilo slide-to-revelar torna isso bastante claro.
Tenha cuidado com a propriedade de EdgeForExtendedLayout com confusão do nome de UIViewController. Ajustar bordasForExtendedLayout não faz nada na maioria dos casos. A única maneira que o UIKit usa essa propriedade é se você adicionar um controlador de visualização a um UINavigationController, então o UINavigationController usa edgeForExtendedLayout para determinar se o controlador de exibição infantil deve ou não ser visível debaixo da barra de navegação / área da barra de status. A definição de bordasForExtendedLayout no UINavigationController em si não faz nada para alterar se o UINavigationController possui ou não uma área de barra de navegação de 44 ou 64 pontos. Veja # 4 para essa lógica. Uma lógica de layout semelhante aplica-se à parte inferior da sua visualizaçã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 suba a barra de navegação quando estiver dentro de UINavigationController, defina edgeForExtendedLayout para UIRectEdgeNone (ou pelo menos uma máscara que exclui UIRectEdgeTop). Defina esse valor o mais cedo possível no ciclo de vida do seu controlador de visualização.
O UINavigationController e o UITabBarController também tentarão preencher as inscrições de conteúdo das vistas de tabela e as vistas de coleção em sua hierarquia de sub-visualização. Ele faz isso de uma maneira semelhante à lógica da barra de status a partir do # 4. Existe uma maneira programática de impedir isso, definindo automaticamente AjustesScrollViewInsets como NO para suas visualizações de tabela e vistas de coleção (ele é padrão para SIM). Isso colocou alguns problemas sérios para Whisper e Riposte, pois usamos ajustes contentInset para controlar o layout das visualizações de mesa em resposta à barra de ferramentas e aos movimentos do teclado.
Para reiterar: não há como retornar à lógica de layout da barra de status do estilo iOS 6. Para aproximar isso, você deve mover todos os controladores de exibição do seu aplicativo para uma visão de contêiner que é compensada por 20 pontos da parte superior da tela, deixando uma visão intencionalmente preta atrás da barra de status para simular a aparência antiga. Este é o método que acabamos usando em Riposte e Whisper.
A Apple está empurrando muito para garantir que você não tente tentar # 9. Eles querem que nós redesenhamos todas as nossas aplicações para subjugar a barra de status. Há muitos argumentos convincentes, no entanto, tanto para a experiência do usuário quanto para os motivos técnicos, porque isso nem sempre é uma boa idéia. Você deve fazer o que é melhor para seus usuários e não simplesmente seguir o capricho da plataforma.
Acompanying Stack Overflow answer available here.
Corrigindo o problema de sobreposição da barra de navegação iOS 7.
Houve um problema que está envolvendo desenvolvedores de iOS desde que as barras de navegação bastante transparentes vieram no iOS 7, algo que quando eu pergunto às pessoas por que isso acontece, eles absolutamente não tem ideia.
Existe uma solução simples que todos estão usando, mas é um hack e muitos desenvolvedores acabaram de usá-lo sem entender o problema.
Coloque isso no seu controlador e, de repente, ele apenas funciona. um pouco. Agora, a barra de navegação não tem como ser transparente, o que derrota o propósito. As visualizações que deveriam estar por trás disso, nossa visão de raiz, e a cor do plano de fundo, que não está sendo exibida.
Honestamente, você pode não se importar, isso pode ser suficiente para você, mas é importante que você ainda entenda o problema, então leia. Se você fez o desenvolvimento da web, isso é como um estouro: oculto no CSS. O trabalho, mas ainda é um tipo de "hack".
Então, o problema é que, quando o quadro da re view estiver configurado, ao contrário do iOS 6, o quadro ainda engloba a área embaixo da barra de navegação.
O que você talvez não tenha percebido, é se um UIScrollView ou uma subclasse como UITableView, é a visão de raiz do seu controlador, ele terá a propriedade contentInset da propriedade definida corretamente, permitindo que o quadro esteja por baixo da barra de navegação, mas a origem real que começa a desenhar é da parte inferior da barra de navegação.
Isso significa que podemos simplesmente resolver o problema da sobreposição da barra de navegação, fazendo com que nossa visão de raiz seja UIScrollView (ou subclasse de), enquanto ainda deixa nossa cor de fundo brilhar.
Você pode fazer sua visão de raiz um UIScrollView definindo o método loadView, onde sua visão de raiz e suas submissões devem estar sendo criadas se você estiver criando suas visualizações de forma programática.
Se você tentar isso, você obterá isso.
Observe o vermelho brilhando através da barra de navegação? Observe que nós estabelecemos a origem da tela azul para ser o canto superior esquerdo? Tudo está bem sentado e funciona como a Apple esperava que usássemos as barras de navegação transparentes.
Isso tem o bônus adicional de nos dar uma maneira mais fácil de expandir nosso layout além da tela, agora, agora que estamos usando uma exibição de rolagem, mas você pode não precisar disso de qualquer maneira, em vez disso, você pode apenas usá-lo como um substituto para UIView que pode ter o conjunto contentInset da sua.
Eu não procurei as diferenças de memória para isso, mas minha expectativa é que seria extremamente mínimo.
Se você quiser saber mais sobre o RubyMotion, confira os meus screencasts em https://motioninmotion. tv/ ou o meu próximo livro RubyMotion for Rails Developers, que está disponível para pré-encomenda agora, sob um modelo de pagamento Pay What You Want, com a parte 1 quase terminada e deve ser lançada em breve.
RubyMotion Adventures - O Blog MotionInMotion.
RubyMotion Adventures - The MotionInMotion Blog info @ fluffyjack.
Tutoriais, dicas, guias e fatos divertidos RubyMotion. Novas postagens em nenhum programa que não sejam "postar frequentemente"
No comments:
Post a Comment