A primeira tela do meu aplicativo é UITableViewController
sem barra de navegação, o que significa que o conteúdo flui sob a barra de status, para que haja muitas colisões de texto. Eu ajustei as duas propriedades Under top bars
e as Adjust scroll view insets
quais na verdade impedem a rolagem para baixo, mas com o custo de manter a parte superior da exibição da tabela em baixo. Tentei definir o UITableView
quadro para compensar 20 pixels, mas ele não parece entrar em vigor e, como atualmente preciso do aplicativo para ser compatível com o iOS 6, não posso pular para o iOS 7 Storyboards para forçar o uso do AutoLayout o guia de altura superior. Alguém encontrou uma solução que funcione para as duas versões?
Coisas que eu tentei: definir edgesForExtendedLayout
, alterar as configurações no Storyboard para Under top bars
e Adjust scroll view
forçar o quadro para uma nova área.
Uma imagem vale mais que mil palavras:
fonte
UITableView
cabeçalho lá, ele também flui sob a barra de status.Respostas:
Para qualquer pessoa interessada em replicar isso, basta seguir estas etapas:
UIViewController
UITableViewController
da Biblioteca de objetosSe você seguir as etapas acima, ao executar o aplicativo, verá que nada, incluindo ajustar as caixas de seleção do Xcode para "Estender arestas sob as barras {superior, inferior e opaca}", impede que a primeira linha apareça na barra de status, nem você pode resolver isso programaticamente.
Por exemplo, no cenário acima, o seguinte terá nenhum efeito:
Esse problema pode ser muito frustrante, e acredito que seja um bug no final da Apple, especialmente porque aparece em seus próprios cabos
UITableViewController
da biblioteca de objetos.Eu discordo de todos que estão tentando resolver isso usando qualquer forma de "Números mágicos", por exemplo, "use um delta de 20px". Esse tipo de programação fortemente acoplada definitivamente não é o que a Apple quer que façamos aqui.
Eu descobri duas soluções para esse problema:
Preservando a
UITableViewController
cena da cena :se você deseja manter o
UITableViewController
storyboard, sem colocá-lo manualmente em outra exibição, é possível incorporá-loUITableViewController
emUINavigationController
(Editor> Incorporar> Navegador) e desmarcar a opção "Mostra barra de navegação" no inspetor . Isso resolve o problema sem precisar de ajustes extras, além de preservar aUITableViewController
cena da sua pessoa no storyboard.Usando o AutoLayout e incorporando-o
UITableView
a outra visualização (acredito que é assim que a Apple deseja que façamos isso) :crie um vazio
UIViewController
e arrasteUITableView
-o. Em seguida, pressione Ctrl e arraste do seuUITableView
para a barra de status. Quando o mouse chegar à parte inferior da barra de status, você verá um balão de Autolayout que diz "Guia de layout superior". Solte o mouse e escolha "Espaçamento vertical". Isso informará o sistema de layout para colocá-lo logo abaixo da barra de status.Eu testei nos dois sentidos em um aplicativo vazio e ambos funcionam. Você pode precisar fazer alguns ajustes extras para fazê-los funcionar no seu projeto.
fonte
Se você estiver fazendo as coisas de maneira programática e usando uma
UITableViewController
sem aUINavigationController
sua melhor aposta, faça o seguinte emviewDidLoad
:Swift 3
Swift anterior
A
UITableViewController
barra de rolagem ainda ficará atrás da barra de status, mas não ficará embaixo dela quando rolada para cima.fonte
topLayoutGuide
comprimento.UIApplication.sharedApplication.statusBarFrame.size.height
em vez de 20.Observe: Isso funcionou para mim na seguinte configuração:
Se os dois requisitos acima não forem atendidos, sua milhagem poderá variar.
Correio Original
Criei minha visão programaticamente e isso acabou funcionando para mim:
Origem (na seção topLayoutGuide na parte inferior da página 39).
fonte
Adicionando à resposta superior:
depois que o segundo método não pareceu funcionar, eu fiz alguns ajustes adicionais e encontrei a solução.
TLDR; a segunda solução da resposta principal quase funciona, mas para algumas versões do xCode, pressione a tecla Ctrl e arraste para "Guia de layout superior" e selecione Espaçamento vertical. No entanto, ajustando primeiro o tamanho da Visualização da tabela e selecionando "Guia de layout de espaço superior a superior" funciona
Arraste um ViewController em branco para o storyboard.
Arraste um objeto UITableView para a Exibir. (Não UITableViewController). Posicione-o no centro, usando as guias de layout azuis.
Crie sua subclasse personalizada de UIViewController e adicione o
<UITableViewDataSource, UITableViewDelegate>
protocolos. Não se esqueça de definir o ViewController do seu storyboard para essa classe no Identity Inspector.Crie uma saída para o seu TableView no seu arquivo de implementação e chame-o de "tableView"
Agora, a parte de não recorte na barra de status.
Agora você pode configurar sua exibição de tabela normalmente, e ela não cortará a barra de status!
fonte
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1
fonte
self.topLayoutGuide.length
deviewDidLayoutSubviews
irá estragar o layout das visualizações filho.Selecione UIViewController no seu storyboard e desmarque a opção Estender arestas sob as barras superiores. Trabalhou para mim. :)
fonte
É assim que se escreve em "Swift". Um ajuste na resposta de @ lipka:
fonte
- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
Para o Xcode 7, desmarcar a marca de seleção 'translúcida' da barra de navegação funcionou para mim.
fonte
Isso o corrigirá para um UITableViewController (sem nenhum número mágico). A única coisa que não consegui consertar é se você estiver em uma ligação, e nesse caso a parte superior do tableView é pressionada demais. Se alguém souber como resolver isso, informe-nos.
fonte
Não sei o quão Kosher é, mas descobri que esse esquema move a visão do ViewController para baixo e fornece à barra de status um histórico sólido:
Claro, substitua
redColor
pela cor que desejar para o fundo.Você deve executar um dos swizzles separadamente para definir a cor dos caracteres / símbolos na barra de status. Eu uso
View controller-based status bar appearance = NO
e,Status bar style = Opaque black style
no essencial, para fazer isso globalmente.Parece funcionar, e eu ficaria interessado em ouvir algum bug ou problema com ele.
fonte
A resposta do chappjc funciona muito bem quando se trabalha com XIBs.
Encontrei a solução mais limpa ao criar o TableViewControllers programaticamente, envolvendo a instância UITableViewController em outro UIViewController e definindo as restrições de acordo.
Aqui está:
Cheers, Ben
fonte
Acho que a abordagem para usar o UITableViewController pode ser um pouco diferente do que você fez antes. Funcionou para mim, mas você pode não ser um fã disso. O que fiz foi ter um controlador de exibição com uma exibição de contêiner que aponta para meu UItableViewController. Dessa forma, posso usar o TopLayoutGuide fornecido ao meu storyboard. Basta adicionar a restrição à visualização do contêiner e você deve cuidar do iOS7 e iOS6.
fonte
Acabei usando uma visualização extra com o fundo desejado, adicionado após o TableView e colocado na barra de status:
Não é muito bonito, mas é uma solução bastante simples, se você precisar trabalhar com visualizações sem xib e com o IOS6 e o IOS7
fonte
Fiz isso para a exibição Retina / Não Retina como
fonte
A solução a seguir funciona bem em código sem usar constantes mágicas e explica o usuário alterando a classe de tamanho, por exemplo, através de rotações ou aplicativos lado a lado em ipads:
fonte
Funciona com rapidez 3 - In viewDidLoad ();
Este código: 1. Obtém a altura da barra de status 2. Fornece à parte superior da tabela uma inserção de conteúdo igual à altura da barra de status. 3. Fornece o mesmo indicador de rolagem, para que ele apareça abaixo da barra de status.
fonte
Para aqueles como eu, que preferem não incorporá-los
UITableViewController
em umUIViewController
tente o seguinte:Uma
UITableViewController
subclasse personalizada pode anexar uma visualização de máscara à superview do tableView. Adicione a máscara em viewDidAppear e remova a máscara em viewWillDisappear.fonte
Eu tinha um UISearchBar na parte superior do meu UITableView e o seguinte funcionou;
Compartilhe e curta...
fonte
Eu consegui trabalhar definindo o tamanho para forma livre
fonte
A solução de Abrahamchez https://developer.apple.com/library/ios/qa/qa1797/_index.html funcionou para mim da seguinte maneira. Eu tinha um único controlador UITableview como minha visualização inicial. Eu tentei o código de deslocamento e a incorporação em um navcon, mas nenhum resolveu a transparência da barra de status.
Adicione um Viewcontroller e torne-o a visualização inicial. Isso deve mostrar os guias críticos de layout superior e inferior.
Arraste o Tableview antigo para a View no novo controlador.
Faça todo o necessário para adaptar a tabela ao novo controlador:
Altere seu arquivo controller.h da visualização antiga para herdar / subclasse de UIViewController em vez de UITableViewController.
Adicione UITableViewDataSource e UITableViewDelegate ao .h do controlador de exibição.
Reconecte qualquer coisa necessária no storyboard, como uma barra de pesquisa.
O importante é configurar as restrições, como nas perguntas e respostas da Apple. Não me incomodei em inserir uma barra de ferramentas. Não tenho certeza da sequência exata. Mas um ícone vermelho apareceu nos Guias de layout, talvez quando eu construí. Cliquei e deixei o Xcode instalar / limpar as restrições.
Depois, cliquei em todos os lugares até encontrar a restrição de espaço vertical e alterar seu valor máximo de -20 para 0 e funcionou perfeitamente.
fonte
Estou usando um UISplitViewController com um controlador de navegação e um controlador de tableview. Isso funcionou para mim na visualização principal depois de tentar muitas soluções aqui:
É semelhante à solução do Hot Licks, mas aplica a subvisão ao navigationController.
fonte
fonte
Aqui está um Swift 2.3. (Xcode 8.0). Eu criei uma subclasse de UITableView.
O conteúdo inserido sempre deve ser zero (por padrão). Estou definindo Zero manualmente. Você também pode adicionar um método de verificação que faça a verificação e, se for algo diferente do que você deseja, obtenha o retângulo correto. A alteração será refletida apenas quando a visualização da tabela for desenhada (o que não acontece frequentemente).
Não se esqueça de atualizar o TableView no seu IB (no TableViewController ou apenas no TableView dentro do seu ViewController).
fonte
Eu estava enfrentando esse problema no iOS 11, mas o layout estava correto para o iOS 8 - 10.3.3. Para o meu caso, defino uma restrição de espaço vertical como Superview.Top Margin em vez de Superview.Top, que funciona para o iOS 8-11.
fonte
Eu achei a maneira mais fácil de fazer isso, especialmente se você estiver adicionando sua visualização de tabela dentro da barra de guias, primeiro adicione uma visualização e, em seguida, adicione a visualização de tabela dentro dessa visualização . Isso fornece os guias de margem superior que você está procurando.
fonte
veja todas as soluções: meu projeto é apenas usar xib; portanto, a solução com storyboard não funcionou para mim. self.edgesForExtendedLayout = UIRectEdgeNone; só funciona para o controlador se a barra de navegação estiver visível. mas se sua visualização tiver apenas barra de status, isso não funcionará. então eu combino duas condições.
ajude isso a funcionar.
fonte
Se você também precisar oferecer suporte ao iOS 6, precisará movê-lo condicionalmente para baixo. Ou seja, no iOS 7, você deve movê-lo para baixo em 20 pontos (por
frame
manipulação ou usando o layout automático) e no iOS 6, você o deixa em paz. Eu não acredito que você possa fazer isso no IB, então você terá que fazer isso no código.EDITAR
Você pode realmente fazer isso no IB, usando os deltas do iOS6 / iOS7. Defina sua posição no iOS 7 e, no iOS 6, defina o delta Y para -20 pontos. Veja esta pergunta para mais informações.
fonte
self.view.frame
eself.tableView.frame
, em ambosviewWillAppear
eviewDidLoad
. Para estar seguro, também definisetContentNeedsDisplay
para forçar um redesenho.