Tuesday, 17 April 2018

Edgesforextendedlayout not work


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"

Edgesforextendedlayout não funciona
Obter através da App Store Leia esta publicação em nosso aplicativo!
Setting & quot; edgesForExtendedLayout = UIRectEdgeNone & quot; não impede que minha sub-visualização mude para o iOS 7.
Eu tenho um controlador de visualização que foi escrito nos dias do iOS 5 e estou tentando transicioná-lo para o iOS 7. Depois de ler o guia de transição do iOS 7 e mexendo em SO, descobri que preciso definir o novo iOS 7 bordas de propriedadeForExtendedLayout para UIRectEdgeNone para evitar que uma das minhas sub-visualizações personalizadas apareça 49 pixels mais alto no iOS 7 do que aparece no iOS 6. No entanto, após a configuração dessa propriedade, minha sub-visualização personalizada ainda está aparecendo 49 pixels maior no iOS 7 e eu não " Eu sei o que mais eu preciso fazer. Aqui está o meu código simples que adicionei ao meu método viewDidLoad.
e aqui está o código para criar e adicionar a sub-visualização personalizada que está aparecendo mais alto no iOS 7.
Um outro detalhe importante, se isso ajudar, é que essa visão é criada a partir de um arquivo nib, mas a subvisão personalizada que está aparecendo mais alto no iOS 7 do que o iOS 6 é a única subvisão criada e adicionada programaticamente no viewDidLoad, depois de configurar o propriedade edgeForExtendedLayout. Todas as outras sub-visualizações criadas a partir do nib não são afetadas independentemente da configuração ou não da propriedade egdesForExtendedLayout.
Minhas duas perguntas são.
Por que minha sub-visualização personalizada aparece mais alto no iOS 7, mesmo depois de configurar a propriedade edgeForExtendedLayout para UIRectEdgeNone? Por que as outras sub-visualizações (as subpastras que são carregadas a partir da ponta) não são as mais avançadas no iOS 7?
Agradeço antecipadamente pela sua sabedoria!
É o objetivo de edgeForExtendedLayout que foi configurado para UIRectEdgeNone para não estender a exibição em qualquer direção, mas sua visão agora começará na origem dentro do tamanho da tela (agora abaixo do statusBar!) Ao usar uma moldura com posição de 0, 0 ( como você fez com o customControl). Você precisa ajustar o quadro da sua view / viewController para representar que deseja iniciar sob o statusBar / navigationBar ou tornar o status / nagivationBar opaco; ou adicionar UIRectEdgeTop se usado apenas para uma visualização.
Configurando o navegadorController para opaco também o fará com o statusBar:
Como o construtor de interface define o quadro corretamente no navegador por padrão, você pode alterá-lo, é claro. E usa UIRectEdgeAll e autoresizing.
Descobri, em alguns casos, que a definição das bordasForExtendedLayout em viewWillAppear: em vez de viewDidLoad me dá o resultado que eu procuro. Isso pode não resolver seu problema, mas isso me ajudou em alguns casos e espero que ele ajude os outros.

bordas para layout estendido.
As bordas que você estende para seu controlador de exibição.
Declaração.
Discussão.
Em vez dessa propriedade, use a área segura da sua visão para determinar quais partes da sua interface estão ocluídas por outros conteúdos. Para obter mais informações, consulte o Guia de Layout de área seguro e as propriedades seguras da Área de inserções do UIView.
No iOS 10 e anterior, use esta propriedade para informar quais bordas do seu controlador de exibição se estendem por baixo das barras de navegação ou outras exibições fornecidas pelo sistema. O valor padrão dessa propriedade é tudo, e é recomendável que você não altere esse valor.
Se você remover um valor de borda dessa propriedade, o sistema não apresenta seu conteúdo por baixo de outras barras na mesma borda. Além disso, o sistema fornece um fundo padrão para que as barras translúcidas tenham uma aparência apropriada. O controlador de visualização raiz da janela não reage a essa propriedade.
Configurando o Comportamento de Layout da Visualização.
Um valor booleano que indica se o layout estendido inclui barras opacas.
Chamado a notificar o controlador de visualização de que sua exibição está prestes a criar suas sub-apresentações.
Chamado a notificar o controlador de visualização que a sua visão acabou de arquivar suas submissões.
Chamado quando a visão do controlador de exibição # ™27 precisa atualizar suas restrições.

UITableView amplia as bordas na barra superior # 107.
Ghost comentou 21 de janeiro de 2018.
Eu subclassei o SlackTextViewController para criar meu próprio UITableView, mas descobriu que a exibição da tabela não foi estendida na barra de navegação superior. O inspetor da interface do usuário no Xcode também confirma isso.
Eu me pergunto como posso fazer as bordas do UITableView se estenderem sob a barra de navegação, de modo que o conteúdo no tableview possa aparecer através da barra translúcida.
Editar: depois de examinar o código, descobri que o problema reside nesse método.
Se a propriedade invertida estiver definida como SIM, a propriedade edgeForExtendedLayout será definida automaticamente para UIRectEdgeNone. Se eu remover essa linha, a exibição da tabela mudará para cima.
o fantasma mudou o título de UITableView para ampliar as bordas na barra superior para UITableView estender as bordas na barra superior, deslizar para apagar em 22 de janeiro de 2018.
o fantasma mudou o título do UITableView para ampliar as bordas na barra superior, deslize para excluir as bordas da extensão UITableView na barra superior em 22 de janeiro de 2018.
A exibição de rolagem invertida estende as arestas na barra superior # 109.
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.

No comments:

Post a Comment