воскресенье, 13 мая 2018 г.

Edgesforextendedlayout swift


Edgesforextendedlayout swift
O problema é que meu View, contendo um UIView e um UITableView dentro de um ScrollView, fica oculto sob o UINavigationBar se configurado como translúcido.
Eu considerei vários tópicos como este, mas todos eles sugerem para definir:
No Swift 2, esse código era:
Eu atualizei para o Xcode 8.1 e Swift 3.0.1 hoje, mas não consigo encontrar nada nas notas de lançamento sobre este assunto.
O compilador me diz que..Não foi alterado para. none, mas depois da edição, que. não existe. Alterá-lo para. top não teve nenhum efeito.
O tableView é configurado de forma programática e colocar inserções não ajuda, porque eu tenho um scrollView com um UIView no topo do UITableView que está oculto sob o UINavigationBar.

Edgesforextendedlayout swift
A partir do iOS7, os controladores de visualização usam layout de tela inteira por padrão. Ao mesmo tempo, você tem mais controle sobre como expõe seus pontos de vista e isso é feito com essas propriedades:
Basicamente, com essa propriedade, você define quais lados da sua exibição podem ser estendidos para cobrir toda a tela. Imagine que você envie um UIViewController para um UINavigationController. Quando a visualização desse controlador de exibição é exibida, ele será iniciado onde a barra de navegação termina, mas essa propriedade definirá quais lados da exibição (superior, esquerda, inferior, direita) podem ser estendidos para preencher a tela inteira.
Vamos ver isso com um exemplo:
Aqui você não está definindo o valor de edgesForExtendedLayout, portanto, o valor padrão é obtido (UIRectEdgeAll), portanto, a exibição estende seu layout para preencher toda a tela.
Este é o resultado:
Como você pode ver, o fundo vermelho se estende por trás da barra de navegação e da barra de status.
Agora, você vai definir esse valor para UIRectEdgeNone, então você está dizendo ao controlador de exibição para não estender a visão para cobrir a tela:
Esta propriedade é usada quando sua visão é um UIScrollView ou similar, como um UITableView. Você quer que sua tabela comece onde a barra de navegação termina, porque você não verá todo o conteúdo se não, mas ao mesmo tempo você quer que sua tabela cubra toda a tela ao rolar. Nesse caso, configurar edgesForExtendedLayout para None não funcionará porque sua tabela iniciará a rolagem onde a barra de navegação termina e não passará por ela.
Aqui é onde esta propriedade vem a calhar, se você deixar o controlador de visualização ajustar automaticamente as inserções (definindo essa propriedade como YES, também o valor padrão), ele adicionará inserções à parte superior da tabela, portanto a tabela iniciará onde a navegação a barra termina, mas o pergaminho cobrirá a tela inteira.
É quando está definido como NO:
E SIM (por padrão):
Em ambos os casos, a tabela rola atrás da barra de navegação, mas no segundo caso (YES), ela será iniciada abaixo da barra de navegação.
Este valor é apenas um acréscimo aos anteriores. Por padrão, esse parâmetro está definido como NO. Se a barra de status for opaca, as visualizações não serão estendidas para incluir a barra de status, mesmo se você estender sua exibição para cobri-la (edgesForExtendedLayout para UIRectEdgeAll).
Se você definir o valor como YES, isso permitirá que a visualização passe por baixo da barra de status novamente.
Se algo não estiver claro, escreva um comentário e eu responderei.
Como o iOS sabe o que o UIScrollView deve usar?
O iOS captura a primeira subvisualização na visualização do seu ViewController, aquela no índice 0, e se for uma subclasse do UIScrollView, aplica as propriedades explicadas a ele.
Obviamente, isso significa que o UITableViewController funciona por padrão (já que o UITableView é a primeira visualização).

Como parar sua visualização indo sob a barra de navegação usando edgesForExtendedLayout.
A partir do iOS 7.0, todas as visualizações passam automaticamente por barras de navegação, barras de ferramentas e barras de guias para fornecer o que a Apple chama de & quot; contexto & quot; - ter uma ideia do que está por baixo da interface do usuário (embora borrada com um efeito de vidro fosco) dá aos usuários uma ideia do que mais está fora da tela.
Se isso está ficando no seu caminho (e honestamente ele fica no caminho surpreendentemente frequentemente), você pode facilmente desabilitá-lo para um determinado controlador de visão, modificando sua propriedade edgesForExtendedLayout.
Por exemplo, se você não quiser que um controlador de exibição vá atrás de nenhuma barra, use isto:
Disponível no iOS 7.0.
Essa solução funcionou para você? Por favor, passe adiante!
Sobre a Base de Conhecimento Swift.
Isso faz parte da Base de Conhecimento Swift, uma coleção de soluções gratuita e pesquisável para perguntas comuns sobre o iOS.
Leve o seu aprendizado Swift para o próximo nível: compre o e-book Hacking with Swift e receba material bônus para ajudá-lo a aprender mais rápido!

iOS7, nós temos um problema.
Hoje é o dia, o iOS7 é lançado para todos os iPhones & amp; iPads. O que isso significa para nós desenvolvedores? Muito trabalho, isso é o que. Ao contrário de outras transições iOS5 - & gt; iOS6, todos os aplicativos anteriores "### apenas trabalharam" # 8221; mas esta versão é a maior mudança desde o iOS 3.0. Aproximadamente cerca de 90% dos aplicativos testados estão com problemas para executar no iOS7. Esses problemas variam desde os aplicativos que falharam na inicialização até os rótulos foram alinhados incorretamente à barra de status na parte superior da visualização desordenada.
Vamos dar uma olhada no problema mais comum que os desenvolvedores estão tendo, a barra de status.
Barra de status aparece na minha vista.
Você pode conseguir isso implementando uma nova propriedade chamada edgesForExtendedLayout no iOS7 SDK. Por favor, adicione o seguinte código para conseguir isso,
Você precisa adicionar o acima em seu método (void) viewDidLoad.
O iOS 7 traz várias alterações em como você configura e personaliza a aparência da sua interface do usuário. As alterações no layout do controlador de visualização, na cor da tinta e na fonte afetam todos os objetos UIKit no seu aplicativo. Além disso, os aprimoramentos nas APIs do reconhecedor de gestos proporcionam a você um controle mais refinado sobre interações de gestos.
No iOS 7, os controladores de visualização usam o layout de tela inteira. Ao mesmo tempo, o iOS 7 oferece um controle mais granular sobre a maneira como um controlador de exibição exibe suas visualizações. Em particular, o conceito de layout de tela inteira foi refinado para permitir que um controlador de visualização especifique o layout de cada borda de sua visualização.
A propriedade do controlador de visualização wantsFullScreenLayout foi descontinuada no iOS 7. Se você atualmente especifica wantsFullScreenLayout = NO, o controlador de exibição pode exibir seu conteúdo em um local de tela inesperado quando é executado no iOS 7.
Para ajustar como um controlador de exibição mostra suas visualizações, o UIViewController fornece as seguintes propriedades:
A propriedade edgesForExtendedLayout usa o tipo UIRectEdge, que especifica cada uma das quatro bordas do retângulo, além de especificar none e all. Use edgesForExtendedLayout para especificar quais arestas de uma vista devem ser estendidas, independentemente da barra de translucidez. Por padrão, o valor dessa propriedade é UIRectEdgeAll.
Se seu design usar barras opacas, refine edgesForExtendedLayout definindo também a propriedade extendedLayoutIncludesOpaqueBars como NO. (O valor padrão de extendedLayoutIncludesOpaqueBars é NO.)
Se você não quiser que os inserts de conteúdo da visualização de rolagem sejam ajustados automaticamente, definaAdjustsScrollViewInsets como NO automaticamente. (O valor padrão de automaticallyAdjustsScrollViewInsets é YES.)
As propriedades topLayoutGuide e bottomLayoutGuide indicam a localização das arestas da barra superior ou inferior na exibição de um controlador de exibição. Se as barras devem se sobrepor à parte superior ou inferior de uma vista, você pode usar o Interface Builder para posicionar a vista relativa à barra, criando restrições para a parte inferior do topLayoutGuide ou para o topo do bottomLayoutGuide. (Se nenhuma barra deve se sobrepor à vista, a parte inferior do topLayoutGuide é a mesma que a parte superior da vista e a parte superior do bottomLayoutGuide é a mesma que a parte inferior da vista.) Ambas as propriedades são criadas preguiçosamente quando solicitadas.

Edgesforextendedlayout swift
Para qualquer pessoa interessada em replicar isso, basta seguir estas etapas:
Crie um novo projeto para iOS Abra o storyboard principal e exclua o UIViewController padrão / inicial Arraste um novo UITableViewController da Biblioteca de Objetos Configure-o como o controlador de visualização inicial Alimente a tabela com alguns dados de teste.
Se você seguir as etapas acima, quando executar o aplicativo, verá que nada, incluindo ajustes nas caixas de seleção do Xcode para "Estender bordas embaixo das barras", impede que a primeira linha apareça na barra de status, nem pode abordar isso de forma programática.
Por exemplo. No cenário acima, o seguinte não terá efeito:
Este problema pode ser muito frustrante, e eu acredito que seja um bug no final da Apple, especialmente porque ele aparece em seu próprio UITableViewController a partir da biblioteca de objetos.
Eu discordo de todos que estão tentando resolver isso usando qualquer forma de "Magic Numbers", por exemplo "use um delta de 20px". Este tipo de programação fortemente acoplada definitivamente não é o que a Apple quer que façamos aqui.
Eu descobri duas soluções para este problema:
Preservando a cena do UITableViewController:
Se você quiser manter o UITableViewController no storyboard, sem colocá-lo manualmente em outra visualização, você pode incorporar o UITableViewController em um UINavigationController (Editor> Embed In> Controlador de Navegação) e desmarcar "Shows Navigation Bar" no inspetor. Isso resolve o problema sem precisar de ajustes extras e também preserva a cena do seu UITableViewController no storyboard.
Usando AutoLayout e incorporando o UITableView em outra visão (acredito que é assim que a Apple quer que façamos isso):
Crie um UIViewController vazio e arraste seu UITableView nele. Em seguida, pressione Ctrl e arraste de seu UITableView para a barra de status. Quando o mouse chegar à parte inferior da barra de status, você verá uma bolha de preenchimento automático que diz "Guia de layout superior". Solte o mouse e escolha "Espaçamento Vertical". Isso vai dizer ao sistema de layout para colocá-lo logo abaixo da barra de status.
Eu testei ambas as maneiras em um aplicativo vazio e ambos funcionam. Talvez seja necessário fazer alguns ajustes extras para que eles funcionem no seu projeto.

Комментариев нет:

Отправить комментарий