A partir do iOS7, há espaço adicional na parte superior da minha UITableView
, que possui um estilo UITableViewStyleGrouped
.
Aqui está um exemplo:
A visualização da tabela começa na primeira seta, há 35 pixels de preenchimento inexplicável e, em seguida, o cabeçalho verde é UIView
retornado por viewForHeaderInSection
(onde a seção é 0).
Alguém pode explicar de onde vem esse valor de 35 pixels e como posso me livrar dele sem mudar para UITableViewStylePlain
?
Nota:
No iOS 11 e posterior:
tableView.contentInsetAdjustmentBehavior = .never
ios
uitableview
ios7
esilver
fonte
fonte
UITableView
não gosta de ser atribuído um cabeçalho com uma altura de 0,0. Verifique stackoverflow.com/a/31223403/1394534 para obter mais detalhes.self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];
Nota:0.0f
será apenas ignorado se você o usar na altura do retângulo. Portanto, usamos o CGFloat mais próximo de zero possível (pelo menos isso "funcionou" para mim ... apenas não é a solução ideal).Respostas:
Fui ajudado pelo seguinte:
YouStoryboard.storyboard> YouViewController> Inspetor de atributos> Desmarcar - Ajustar inserções de exibição de rolagem.
fonte
collectionview
. (Quando é tableview interiorcollectionviewcell
)Eu brinquei um pouco mais com isso e parece que esse é um efeito colateral da configuração dos tableViews
tableHeaderView = nil
.Como meu tableView aparece dinamicamente
tableHeaderView
, quando preciso ocultar otableHeaderView
, em vez de fazerself.tableView.tableHeaderView = nil;
, faço:Eu gosto mais desta solução do que definir um pouco arbitrário
contentInset.top
porque também usocontentInset.top
dinamicamente. Ter que lembrar de remover 35px extras sempre que recalcularcontentInset.top
é tedioso.fonte
Debug > Color Misaligned Images
o simulador para ver por si mesmo.) Você não quer fazer isso.UITableViewHeaderFooterView
vez do UIView. ECGFLOAT_MIN
funciona da mesma forma,0.01f
mas melhor na teoria.Para o IOS 7, se você estiver alocando uma tableview em um controlador de exibição, poderá consultar
seu problema parecia semelhante ao meu
Atualizar:
Swift no iOS 9.x:
Swift 3:
fonte
UITableView
. Os problemas decorrem do fato de euUITableView
estarUIViewController
dentro de um ambienteUINavigationController
que fazia com que o conteúdo da tabela caísse 44 pontos, para que o conteúdo inicial não estivesse atrás donavBar
. Porém, isso não era necessário no meu layout, por isso causava problemas. Eventualmente, mudei meu código para oautomaticallyAdjustsScrollViewInsets
qual funcionou também.edgesForExtendedLayout = []
Tente alterar a
contentInset
propriedade queUITableView
herdaUIScrollView
.É uma solução alternativa, mas funciona
fonte
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);
funcionou melhor para mim porque havia 20 pixels extras na parte superior e inferior.tente, você pode lidar com isso!
fonte
uncheck Adjust scroll view insets
. Porque às vezes não usamos storyboard para criar nossa interface do usuário.Você pode detectar se o aplicativo está executando o iOS7 ou superior e adicionar esses dois métodos ao seu delegado de exibição de tabela (geralmente no código UIViewController)
Talvez isso não seja uma solução elegante, mas funcione para mim
Versão Swift:
fonte
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Encontrei a causa do meu bug original e criei um projeto de exemplo para mostrá-lo. Eu acredito que há um bug do iOS7.
No iOS7, se você criar um UITableView com o estilo Agrupado, mas não tiver um representante definido no primeiro layout, defina um representante e chame reloadData, haverá um espaço de 35px na parte superior que nunca desaparecerá.
Veja este projeto que fiz mostrando o bug: https://github.com/esilverberg/TableViewDelayedDelegateBug
Especificamente este arquivo: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m
Se a linha 24 estiver ativa,
haverá um espaço extra de 35 px na parte superior. Se a linha 27 estiver ativa e 24 for comentada,
não há espaço no topo. É como se o tableView estivesse armazenando um resultado em cache em algum lugar e não se redesenhando depois que o delegado é definido e reloadData é chamado.
fonte
tableView:heightForHeaderInSection:
etableView:heightForFooterInSection:
retorne 0, você também terá esse problema. A implementação dos métodos de protocolo acima E o retorno de 0,01f o corrigiram para mim.Desmarque a opção "Ajustar inserções de exibição de rolagem"
fonte
Outro comentário rápido ... mesmo no XCode 6.1, há um erro com espaços verticais aparecendo na parte superior de
UIScrollViews
,UITextViews
eUITableViews
.Às vezes, a única maneira de corrigir esse problema é entrar no Storyboard e arrastar o controle de problemas para que não seja mais a primeira subvisão da página.
(Meus agradecimentos a Oded por me apontar nessa direção ... Estou postando este comentário, apenas para adicionar algumas capturas de tela, para demonstrar os sintomas e corrigir.)
fonte
De acordo com este guia de transição para iOS7 da Apple, as inserções de conteúdo da exibição de rolagem são ajustadas automaticamente. O valor padrão de automaticAdjustsScrollViewInsets é definido como YES.
O UIViewController que possui o UITableView deve definir essa propriedade como NO.
Isto irá fazer o truque.
EDIT 1:
Além disso, pode-se tentar -
Isso também remove o preenchimento extra na parte superior.
fonte
Ao usar o TableView agrupado, use-o para evitar o corte de bordas no modo de exibição
fonte
Muitas das respostas anteriores acima são muito hacky. Eles iriam quebrar a qualquer momento no futuro, se a Apple decidir corrigir esse comportamento inesperado.
Raiz do problema:
a
UITableView
não gosta de ter um cabeçalho com uma altura de 0,0. Se o que você está tentando fazer é ter um cabeçalho com uma altura de 0, você pode pular para a solução.mesmo que mais tarde você atribua uma altura diferente de 0,0 ao seu cabeçalho, a
UITableView
não gostará de receber um cabeçalho com uma altura de 0,0 no início.Solução:
Em seguida, a correção mais simples e confiável é garantir que a altura do cabeçalho não seja 0 quando você a atribuir à exibição da tabela.
Algo assim funcionaria:
Algo como isso levaria ao problema em algum momento (normalmente, após um pergaminho):
fonte
tableView.tableHeaderView
é realmente uma visualização acessória acima do conteúdo da linha. Fiquei confuso com os cabeçalhos das seções até a sua resposta.CGFLOAT_MIN
foi substituído porCGFloat.leastNormalMagnitude
no Swift 3Storyboard:
Basta desmarcar:
Adjust Scroll View Insets
nas opções do View ControllerCódigo:
fonte
Esta é a solução para iOS 10 usando o Swift 3:
Você pode se livrar dos preenchimentos superior e inferior implementando os seguintes métodos no
UITableViewDelegate
.fonte
No meu caso, foi isso que me ajudou. Também estou apoiando o ios6.
fonte
Basta adicionar o seguinte ao seu viewDidLoad no seu VC:
fonte
Então, eu estava tentando todos os métodos aqui, e desta vez nenhum deles ajudou. Meu caso era uma visualização de tabela agrupada no iOS 9. Eu realmente não sei por que e como descobri esse, mas, para mim, definir
tableViewHeader
umUIView
com pelo menos a0.01
altura trabalhada.CGRectZero
não ajudou, nada realmente ajudou:fonte
Swift: iOS, eu tinha uma visualização de tablatura na visualização de rolagem. Quando clicava em "Voltar" na mesma tela. A exibição de rolagem ocupa mais espaço na parte superior. Para resolver isso, usei:
Um valor booleano que indica se o controlador de exibição deve ajustar automaticamente suas inserções de exibição de rolagem. O valor padrão é true, o que permite que o controlador de exibição ajuste suas inserções de exibição de rolagem em resposta às áreas da tela consumidas pela barra de status, barra de navegação e barra de ferramentas ou barra de guias. Defina como false se você desejar gerenciar os ajustes inseridos da exibição de rolagem, como quando houver mais de uma exibição de rolagem na hierarquia da exibição.
fonte
Graças à resposta de @Aurelien Porte. Aqui está a minha solução
Causa deste problema: -
Em ViewDidLoad: -
Não há necessidade de algo assim: -
No
heightForHeaderInSection
delegado: -No
viewForHeaderInSection
delegado: -fonte
É assim que pode ser corrigido facilmente no iOS 11 e no Xcode 9.1 através do Storyboard:
Selecione Visualização de tabela> Inspetor de tamanho> Inserções de conteúdo: nunca
fonte
automaticallyAdjustsScrollViewInsets
no iOS 11Estou assumindo que isso é apenas parte do novo
UITableViewStyleGrouped
estilo. Está em todas as visualizações de tabela agrupadas e não parece haver nenhuma maneira direta de controlar esse espaço.Se esse espaço estiver sendo representado por a
UIView
, seria possível pesquisar por todossubviews
osUITableView
para encontrar essa visualização específica e editá-la diretamente. No entanto, também existe a possibilidade de que o espaço seja apenas um deslocamento codificado antes dos cabeçalhos e células serem iniciados e não haverá como editá-lo.Para pesquisar em todas as subvisões (eu executaria esse código quando a tabela não possui células, para facilitar a leitura da saída):
fonte
UITableViewCellScrollView
) no iOS7 nos ensinou uma coisa, é deixar a hierarquia de exibição das classes integradas em paz.po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]
verá que o cabeçalho da tabela, o cabeçalho da primeira seção ou a primeira célula (dependendo do que você usa) naturalmente deixa uma borda de 35px .... boo.Minha resposta será mais geral, mas também pode ser aplicada.
Se a visualização raiz (do ViewController ) ou o primeiro filho (subview) da visualização raiz for uma subclasse do UIScrollView (ou do próprio UIScrollView) e se
A estrutura definirá automaticamente o contentInset pré-calculado .
Para evitar isso, você pode fazer
mas, no meu caso, não pude fazer isso, porque estava implementando o SDK que possui o componente UIView que pode ser usado por outros desenvolvedores. Esse componente UIView contém UIWebView (que possui UIScrollView como a primeira subvisão). Se esse componente for adicionado como o primeiro filho na hierarquia de exibição do UIViewController, inserções automáticas serão aplicadas pelo sistema.
Corrigi isso adicionando uma exibição fictícia com quadro (0,0,0,0) antes de adicionar o UIWebView.
Nesse caso, o sistema não encontrou a subclasse do UIScrollView como a primeira subview e não aplicou inserções
fonte
self.automaticallyAdjustsScrollViewInsets = false
Esse código funcionou para mim. A melhor resposta para mim, escrita na parte
objective-C
superior, foi convertida em Swift.Basta escrever isso
viewDidLoad()
e ele funcionará como um encanto.fonte
Eu tive a mesma correção que arielyz. Depois que mudei o UITableView para não ser a primeira subvisão da exibição pai, ele foi embora. Meu espaço era 20 px, não 35.
Não pude recriá-lo em um retrato xib, apenas um retrato xib. Arquivarei um bug do radar mais tarde se puder reproduzi-lo em um aplicativo de demonstração simples.
fonte
Eu acho que fazer UIEdgeInsets -35 0 0 0 é tedioso. No meu caso, implementei o método tableView: heightForHeaderInSection: e ele pode retornar 0.
Quando mudei de 0 para 0,1f, o problema acabou.
fonte
A única coisa que funcionou para mim foi:
Swift :
Objetivo-C :
Além disso, eu ainda tinha um espaço extra para a primeira seção. Isso foi porque eu estava usando a
tableHeaderView
propriedade incorretamente. Corrigido isso também adicionando:fonte
Código Swift 4: para tableview sem cabeçalhos de seção, você pode adicionar este código:
e você obterá o espaçamento do cabeçalho em 0.
Se você deseja um cabeçalho de sua altura específica, passe esse valor:
e a exibição do delegado viewForHeaderinSection.
fonte
Para ser específico, para remover o espaço tableviewHeader da parte superior, fiz essas alterações:
YouStoryboard.storyboard> YouViewController> Selecione TableView> Inspetor de tamanho> Inserções de conteúdo - defina como nunca.
fonte
usar este eu acho que isso ajuda ...
fonte
fonte