Wednesday 11 October 2017

Edgesforextendedlayout Uitableview Scroll


Como remover o preenchimento inesperado no cabeçalho de um UITableView Quase sempre que eu estabelecer um controlador de navegação, com um controlador de vista raiz que contém uma exibição de tabela o resultado é uma exibição de tabela com um preenchimento inesperado em seu cabeçalho. Porquê A razão pela qual isto acontece é a propriedade de UIViewController s automaticamenteAdjustsScrollViewInsets. Que é um valor booleano que indica se o controlador de exibição deve ajustar automaticamente suas inserções de exibição de rolagem. . E o padrão é YES. A propriedade foi introduzida no iOS 7 e, em conjunto com edgesForExtendedLayout faz o efeito agradável de rolagem de conteúdo abaixo de uma barra de navegação translúcida possível. Como corrigi-lo Até agora, encontrei duas maneiras de resolver este problema de interface do usuário: Definir automaticAdjustsScrollViewInsets como false Definir o valor automaticallyAdjustsScrollViewInsets como false resolve o problema. No Interface Builder isso pode ser feito desvinculando a opção Ajustar a Inserção de Visualização de Rolagem do controlador de exibição onde está a exibição de tabela. Tornar a barra de navegação não translúcida Outra opção é tornar a barra de navegação não translúcida. Essa barra de navegação não dispara a exibição de rolagem inserir ajustes no controlador de exibição. No Interface Builder, isso pode ser feito desatando a opção Translúcido da barra de navegação dos controladores de navegação. Eu também achei que a única maneira de realmente selecionar esse componente é através da árvore de hierarquia de visualização à esquerda. UIViewController containment Uma nota final sobre vistas de tabelas embutidas através da contenção do controlador de exibição. Para evitar o cabeçalho nesses, precisamos definir novamente como falsa a propriedade automaticallyAdjustsScrollViewInsets do controlador de exibição pai. Isso pareceu contra-intuitivo para mim no início. Mas se pensarmos em como o processo de contenção funciona, extraindo a exibição da criança e colocando-a no pai, torna-se óbvio que as regras de layout, como automaticamenteAdjustsScrollViewInsets do pai, se aplicam também à criança. Alimentos para pensamentos Existem outros, talvez melhor, maneira de corrigir este problema Pode ser evitado por estabelecer as visões de forma diferente Por que o controlador de navegação padrão controlador de exibição de tabela da biblioteca de componentes do Interface Builder não fazer isso Olhe mais profundamente na automaticAdjustsScrollViewInsets e edgesForça edgeForExtendedLayout . Ative o JavaScript para exibir os comentários fornecidos por Disqus. Mokagios tech journalThe primeira tela do meu aplicativo é um UITableViewController sem uma barra de navegação, o que significa que o conteúdo flui sob a barra de status por isso há um monte de colisões de texto. Ive ajustado tanto as propriedades para Under Top bares e ajustar rolagem vista inserções que realmente impedem-lo de rolagem em, mas ao custo de manter o topo da tabela sob vista. Ive tentou definir a moldura UITableView para compensar por 20 pixels, mas ele doesnt parecem ter efeito e como eu atualmente preciso do aplicativo para ser compatível com iOS 6 eu não posso pular para iOS 7 Storyboards para forçar autolayout para usar o guia de altura superior. Alguém encontrou uma solução que funcione para ambas as versões Things Ive tried: setting edgesForFextendedLayout. Alterando as configurações dentro do Storyboard para barras inferiores e ajustar a exibição de rolagem. Forçando o quadro a uma nova área. Para qualquer pessoa interessada em replicar isso, esse problema é muito fácil de replicar: crie um novo projeto e exclua o ViewController padrão e substitua-o por um TableViewController que você arraste para o Storyboard da Biblioteca de Objetos. Se você seguir estas etapas, verá que nada, incluindo as caixas de seleção de Xcodes de aprimoramento para Estender Bordas em Barras, bem como o uso, colocará o UITableView abaixo da barra de status. Este problema pode ser muito frustrante, e eu acredito que é um bug no fim das maçãs, especialmente porque ele aparece em seus próprios pré-cabeados TableViewController a partir da biblioteca de objetos. Eu discordo com todo mundo que está tentando resolver isso usando qualquer forma de Magic Numbers, e. Use um delta de 20px. Este tipo de programação fortemente acoplada não é definitivamente o que a Apple quer que façamos aqui. Descobri duas soluções para este problema: Preservando a cena do TableViewController. Se você quiser manter o TableViewController no Storyboard, sem colocá-lo manualmente em outra exibição, você pode incorporar o TableViewController em um Controlador de Navegação (Editor Incorporado no Controlador de Navegação) e desmarque a Barra de Navegação em Mostras. Isso resolve o problema sem ajustes extras necessários, e também preserva você cena TableViewControllers no storyboard Usando AutoLayout e incorporando o TableView em outro modo de exibição (eu acredito que isso é como a Apple quer que façamos isso). Crie um ViewController vazio e arraste seu UITableView nele. Em seguida, arraste Ctrl do TableView para a barra de status. Conforme o mouse chega ao fundo da barra de status, você verá uma bolha Autolayout que diz Top Layout Guide. Solte o mouse e escolha Espaçamento vertical. Isso irá dizer o sistema de layout para colocá-lo logo abaixo da barra de status. Eu testei ambas as maneiras em um aplicativo vazio e ambos funcionam. Você pode precisar fazer alguns ajustes extras para fazê-los trabalhar para o seu projeto. RyanR Eu notei isso também, mas eu acho que está bem em algum ponto. A Apple fez a mesma coisa no Mobile Safari39s abriu guias visão, guias serão exibidos debaixo da barra de status. A solução de controlador de navegação é a solução mais simples, eu root para ele. No entanto, a barra de status translúcido é uma idéia estúpida. Ndash Pride Chung Sep 26 13 at 17:01 A opção 2 não funciona mais no Xcode 5. A ação descrita (ctrl-arrastar) nunca deve ter funcionado, uma vez que é propriedade do sistema Outlets, mas mesmo se você arrastar manualmente para a cena Árvore na esquerda, guia de layout superior NÃO FUNCIONA (deve fazer, AFAICT - Eu acredito que este é outro erro importante no AutoLayout :( :() ndash Adam Dec 10 13 at 11:05 Por favor note: Isso funcionou para mim para o Seguinte configuração: Nenhuma barra de navegação na parte superior da tela (exibição de tabela atende a barra de status) A exibição de tabela é não rolável Se os dois requisitos acima não forem atendidos seu milage pode variar Eu criei minha visão programaticamente e isso acabou funcionando para mim: Fonte: (na seção topLayoutGuide na parte inferior da página 39.) Adicionando à resposta superior: após o método 2 inicialmente não parecia funcionar eu fiz alguns ajustes adicionais e ter encontrado a solução. TLDR a resposta 2 respostas quase funciona, mas Para algumas versões do xCode ctrldragging para Top Layout Guide e selecionando Vertical Spacing não faz nada. No entanto, primeiro ajustando o tamanho da exibição de tabela e, em seguida, selecionando Topo espaço para guia de layout superior funciona Arrastar um objeto UITableView para a exibição. (Não UITableViewController). Posicione-o no centro usando os guias de layout azul. Arraste um UITableViewCell para o TableView. Esta será a sua célula de reutilização protótipo, por isso não se esqueça de definir o seu identificador de reutilização sob a guia Atributos ou você obterá um acidente. Crie sua subclasse personalizada do UIViewController e adicione os protocolos ltUITableViewDataSource, UITableViewDelegategt. Não se esqueça de configurar o ViewController do storyboard para esta classe no Inspetor de identidade. Crie uma saída para o TableView no seu arquivo de implementação e nomeie-o tableView Clique com o botão direito do mouse no TableView e arraste o DataSource eo delegado para o ViewController. Agora para a parte de não cortar na barra de status. Agarre a borda superior da sua vista de tabela e mova-a para baixo para um dos guias de layout automático azul tracejado que estão perto do topo Agora, você pode controlar arrastar a partir da exibição de tabela para o topo e selecione Dar-lhe um erro sobre o layout ambíguo de TableView, basta adicionar restrições em falta e seu feito. Agora você pode configurar sua exibição de tabela como normal, e não vai clip a barra de status Eu não sei como Kosher é, mas eu achei que este esquema move a ViewControllers ver e fornece a barra de status com um fundo sólido: Claro, Substitua o redColor com o que cor você quer para o fundo. Você deve fazer separadamente um dos swizzles para definir a cor dos caracteres / símbolos na barra de status. Eu uso a aparência da barra de status baseada no controlador de exibição e estilo de barra de status Opaque estilo preto no plist, para fazer isso globalmente. Parece funcionar, e eu estaria interessado em saber de quaisquer bugs ou problemas com ele. Respondeu Jan 22 14 at 22:08 this didn39t trabalho para mim ndash Seslyn Mar 29 15 at 21:33 A seguinte solução funciona bem o suficiente no código sem usar constantes mágicas e contas para o usuário alterar a classe de tamanho, p. Através de rotações ou aplicativos lado a lado em ipads: a solução Abrahamchezs developer. apple/library/ios/qa/qa1797/index. html funcionou para mim da seguinte forma. Eu tinha um único UITableviewcontroller como minha visão inicial. Eu tinha tentado o código de deslocamento e incorporação em um navcon, mas nem resolveu a transparência statusbar. Adicione um Viewcontroller e torne-o a visualização inicial. Isso deve mostrar-lhe crítico Top amp Bottom Layout Guias. Arraste o Tableview antigo para o modo de exibição no novo controlador. Faça todo o material para atualizar a tabela para o novo controlador: Altere o arquivo view controller. h antigo para herdar / subclasse de UIViewController em vez de UITableViewController. Adicionar UITableViewDataSource e UITableViewDelegate para o viewcontrollers. h. Reconecte tudo o que for necessário no storyboard, como uma barra de pesquisa. A grande coisa é conseguir as restrições estabelecidas, como na Apple QampA. Eu não me incomodei inserindo uma barra de ferramentas. Não está certo da seqüência exata. Mas um ícone vermelho apareceu nos Guias de Layout, talvez quando eu construí. Eu cliquei nele e deixei o Xcode instalar / limpar as restrições. Então eu cliquei em toda parte até que eu encontrei a restrição de espaço vertical e mudou seu valor superior de -20 para 0 e funcionou perfeitamente. Se você também precisa suportar iOS 6, você terá que condicionalmente movê-lo para baixo. Ou seja, no iOS 7 você deve apenas movê-lo para baixo 20 pontos (através de manipulação de quadro ou usando auto-layout), e no iOS 6 você deixá-lo sozinho. Eu não acredito que você pode fazer isso em IB, então você terá que fazê-lo em código. Você pode realmente fazer isso em IB, usando o iOS6 / iOS7 deltas. Defina sua posição no iOS 7 e, em seguida, para iOS 6 defina o delta Y para -20 pontos. Veja esta pergunta para obter mais informações. Respondeu Sep 19 13 em 19:01 Definir o quadro para baixo doesn39t alterá-lo, infelizmente. Ndash Nicholas Smith Sep 19 13 em 19:07 O que não funciona sobre ele A visão de tabela doesn39t mover para baixo ndash Scott Berrevoets Sep 19 13 em 19:11 Sim, ele permanece na mesma posição. Eu tentei self. view. frame e self. tableView. frame. Em viewWillAppear e viewDidLoad. Para ser seguro também definir setContentNeedsDisplay para forçar um redesenho. A primeira tela do meu aplicativo é um UITableViewController sem uma barra de navegação, o que significa que o conteúdo flui sob a barra de status, por isso há um monte de colisões de texto. Ive ajustado tanto as propriedades para Under Top bares e ajustar rolagem vista inserções que realmente impedem-lo de rolagem em, mas ao custo de manter o topo da tabela sob vista. Ive tentou definir o quadro UITableView para compensar por 20 pixels, mas não parece ter efeito. Em seu viewDidLoad adicione estas linhas: iOS 7: UITableView mostra abaixo da barra de status Avaliado por Ricardo Castellanos em 11:48 Avaliação: 5

No comments:

Post a Comment