Por que há preenchimento extra na parte superior do meu UITableView com o estilo UITableViewStyleGrouped no iOS7

637

A partir do iOS7, há espaço adicional na parte superior da minha UITableView, que possui um estilo UITableViewStyleGrouped.

Aqui está um exemplo:

enter image description here

A visualização da tabela começa na primeira seta, há 35 pixels de preenchimento inexplicável e, em seguida, o cabeçalho verde é UIViewretornado 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
esilver
fonte
você está usando o iOS 7 mais recente? Alguns desses tipos de inconsistências (mas não todas, e talvez não essa) foram curadas nas prévias versões anteriores do desenvolvedor. Eu deveria saber: eu procrastinei muitos dos problemas desaparecidos.
Dan Rosenstark 18/09/2013
Verifique a resposta aqui - stackoverflow.com/a/18986158/1463604
Nishant
A resposta curta é que esse preenchimento extra provavelmente se deve ao cabeçalho da visualização da tabela (não ao cabeçalho da seção) e que UITableViewnã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.
Aurelien Porte
30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];Nota: 0.0fserá 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).
Alejandro Iván
1
@ AlejandroIván seu comentário acabou de fazer a minha noite. Eu tenho um tableView com protótipos agrupados. Estou usando numberSections = data.count e definindo numberRows = 1. Defino um heightForFooterInSection para criar um espaço limpo entre cada um e, por algum motivo, um tableHeaderView em branco apareceu.
Ryan Alexander

Respostas:

863

Fui ajudado pelo seguinte:

YouStoryboard.storyboard> YouViewController> Inspetor de atributos> Desmarcar - Ajustar inserções de exibição de rolagem.

insira a descrição da imagem aqui

Alexander
fonte
42
Eu acho que essa é a maneira correta de remover esse preenchimento, em vez de adulterar os valores edgeInset.
Hgeg
21
Isso não funcionou para mim - eu tenho uma barra de navegação opaca acima e isso desativa o conteúdo.
precisa saber é o seguinte
5
Não funciona ao usar personalizado collectionview. (Quando é tableview interior collectionviewcell)
Akshit Zaveri
5
Não funcionou para mim; A única coisa que funcionou foi mudar para Plain em vez de Agrupado
shim
28
Eu tive esse problema com um TableViewController dentro de uma exibição de contêiner. Eu tive que definir essa propriedade não diretamente no TableViewController que foi incorporado, mas no controlador de exibição que continha a exibição do contêiner. Então funcionou.
Andy Mortimer
326

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 o tableHeaderView, em vez de fazer self.tableView.tableHeaderView = nil;, faço:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

Eu gosto mais desta solução do que definir um pouco arbitrário contentInset.topporque também uso contentInset.topdinamicamente. Ter que lembrar de remover 35px extras sempre que recalcular contentInset.topé tedioso.

Mr. T
fonte
4
Ótima solução! Na verdade, você deve defini-lo como 0,01f para se livrar da visualização padrão do cabeçalho da tabela, como no seu código.
Simone Manganelli
2
BTW, isso também é possível com um arrastar e soltar no Interface Builder. De qualquer forma, obrigado! :)
Rudolf Adamkovič
8
o senhor merece uma medalha por isso
Vaibhav Gautam
7
Lembre-se de que uma visualização de altura de 0,01f na parte superior da visualização da tabela significa que todas as células abaixo estão desalinhadas (primeira célula com uma origem Y de 0,01, a próxima célula_ altura + 0,01 etc.), de modo que o conteúdo dessas células será desalinhado. (Ligue Debug > Color Misaligned Imageso simulador para ver por si mesmo.) Você não quer fazer isso.
Simon Whitaker
2
É melhor usar em UITableViewHeaderFooterViewvez do UIView. E CGFLOAT_MINfunciona da mesma forma, 0.01fmas melhor na teoria.
Jaybo
178

Para o IOS 7, se você estiver alocando uma tableview em um controlador de exibição, poderá consultar

self.edgesForExtendedLayout = UIRectEdgeNone;

seu problema parecia semelhante ao meu

Atualizar:

Swift no iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
yeahdixon
fonte
3
Trabalhou na minha planície UITableView. Os problemas decorrem do fato de eu UITableViewestar UIViewControllerdentro de um ambiente UINavigationControllerque fazia com que o conteúdo da tabela caísse 44 pontos, para que o conteúdo inicial não estivesse atrás do navBar. Porém, isso não era necessário no meu layout, por isso causava problemas. Eventualmente, mudei meu código para o automaticallyAdjustsScrollViewInsetsqual funcionou também.
DBD 23/06
Esta propriedade é aplicada apenas para exibir os controladores incorporados em um contêiner, como UINavigationController. O controlador de visualização raiz da janela não reage a essa propriedade. O valor padrão desta propriedade é tudo. ..Sinto que o padrão deve ser 0? Onde isso tem uma vantagem?
Desh_ 13/06/19
5
Mais elegante com o Swift 3:edgesForExtendedLayout = []
Dave Batton
Olá @yeahdixon Qual software você usa para fazer a seta rosa? obrigado antecipadamente
iArezki 4/17
175

Tente alterar a contentInsetpropriedade que UITableViewherda UIScrollView.

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

É uma solução alternativa, mas funciona

nvrtd frst
fonte
6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);funcionou melhor para mim porque havia 20 pixels extras na parte superior e inferior.
Brian
1
Embora essa solução de "força bruta" funcione, acho que as de baixo (especificamente as inserções de ajuste automático) devem ter uma classificação mais alta.
eladleb
134
self.automaticallyAdjustsScrollViewInsets = NO;

tente, você pode lidar com isso!

guanhuiwit
fonte
Isso funciona muito bem para ocultar o tableHeaderView no iOS 7.0, mas não é suportado em versões mais antigas.
Brian
Funciona muito bem no iOS 7.
StackRunner
3
Importante: Certifique-se de fazer isso no controlador de exibição de contêiner, se o UITableView for colocado em um controlador que é incorporado a outro controlador, faça-o no controlador superior de incorporação, não diretamente no local em que você coloca o UITableView (onde o AutoLayout irá cuidar das coisas).
James Stone
Isto é melhor que uncheck Adjust scroll view insets. Porque às vezes não usamos storyboard para criar nossa interface do usuário.
precisa saber é
Isso funciona para mim. Anexei a visualização à barra de navegação e à tableview, isso não aconteceu no iOS 11, mas ocorre no iOS 10. Obrigado.
Dobiho 6/02
78

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)

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

Talvez isso não seja uma solução elegante, mas funcione para mim

Versão Swift:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
Homem leve
fonte
1
Isso funcionou para mim. O UITableView adiciona espaço por várias razões diferentes. Especificamente, relacionado ao OP, o problema ocorre apenas para a exibição de tabela de estilo agrupado. E esta solução resolveu o problema.
RajV 28/10
5
Você pode usar CGFLOAT_MIN em vez de 0,001, ele fornece o menor valor absoluto de CGFloat.
eiKatte
2
Esta é a resposta correta, já que o recurso real é que o preenchimento está lá apenas na tabela de estilo de vista agrupados e é ignorado se você especificar o cabeçalho / rodapé
Jakub Truhlář
Isso deve ser marcado como a resposta correta. Um método delegado para substituir e responde à pergunta. Pelo menos tente isso primeiro se você ler até aqui todos os hacks. Tente twittar: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: (NSInteger) section {// return CGFLOAT_MIN; retornar 30.0f; }
Matthew Ferguson
Agradável! Como um bônus, se você quer um pouco de cabeçalho no topo e mais entre as seções agrupadas, você pode usar o seguinte:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders
55

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,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

haverá um espaço extra de 35 px na parte superior. Se a linha 27 estiver ativa e 24 for comentada,

self.tableView.delegate = self;

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.

esilver
fonte
21
Eu acrescentaria que, mesmo que haja um delegado, mas o delegado tableView:heightForHeaderInSection:e tableView: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.
John esotropia
1
SIM!! Eu tentei 3 soluções, e essa foi a única! Brilhante, obrigado: D
Henrik Erlandsson 8/13
perfeito. Alguém relatou um bug porque acho que esse não é o comportamento pretendido.
Pushparaj
ótimo encontrar! Isso ainda está acontecendo no ios 9 (não estamos usando XIBs), mas a configuração do delegado no init corrigiu o espaçamento (não no loadView ou viewDIdLoad). Obrigado!
precisa
1
Definir estimatedHeight para cabeçalho me ajudou
Viktor
49

Desmarque a opção "Ajustar inserções de exibição de rolagem"

insira a descrição da imagem aqui

Tú Đt
fonte
Eu precisava dessa opção para outro View Controller meu e, aparentemente, quando fiz um novo VC, a alteração foi transferida. Obrigado por isso!
David
sim! Works, basta configurá-lo no ContainerView e funciona!
Felipe FMMobile
46

Outro comentário rápido ... mesmo no XCode 6.1, há um erro com espaços verticais aparecendo na parte superior de UIScrollViews, UITextViewse UITableViews.

insira a descrição da imagem aqui

À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.

insira a descrição da imagem aqui

(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.)

Mike Gledhill
fonte
1
Observe que esse problema de erro, erro, também acontece no iOS 8 se você tiver um UITextView como o primeiro subcontrole da sua página ... portanto, não é apenas um problema do UITableView.
Mike Gledhill
1
Fora de toda solução, apenas esse truque funcionou para mim. Uma correção estranha para um bug estranho. Eu enfrentei esse problema com o UITableview.
Mesbah
4
1 milhão de agradecimentos! Esta é a única solução que funcionou para mim.
user139816
1
(. Estou espantado com a sua 18 meses mais tarde, e os leitores ainda estão a votar esta resposta tem a Apple seriamente não resolveu esse problema ainda?!)
Mike Gledhill
1
salvou a minha vida! obrigado. você sabe quanto tempo levou para encontrar essa pequena "correção" simples? grrh.
Mc.Stever
40

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.

self.automaticallyAdjustsScrollViewInsets = NO;

Isto irá fazer o truque.

EDIT 1:

Além disso, pode-se tentar -

self.navigationController.navigationBar.translucent = YES;

Isso também remove o preenchimento extra na parte superior.

girish_vr
fonte
Resposta muito boa, a menos que não responda exatamente à pergunta. A Esilver fala sobre uma diferença de 35px, mas o iOS7 adiciona um cabeçalho adicional de 20px: igual à altura da barra de status.
Martin Martin
Problema ridículo. Obrigado pela resposta.
Genki
Esta é a resposta para um problema diferente.
entonio 9/11/14
Obrigado funcionou para mim, no meu caso particular, eu tinha um tableviewcontroller embutido no viewcontroller e definindo automaticallyAdjustsScrollViewInsets = false na viewcontroller a lacuna superior desapareceu
Alexey
39

Ao usar o TableView agrupado, use-o para evitar o corte de bordas no modo de exibição

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Aqib Mumtaz
fonte
Tentei todos os outros. Este é o que funcionou! Thx
Michael
36

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:

  1. a UITableViewnã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.

  2. mesmo que mais tarde você atribua uma altura diferente de 0,0 ao seu cabeçalho, a UITableViewnã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:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

Algo como isso levaria ao problema em algum momento (normalmente, após um pergaminho):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Aurelien Porte
fonte
Finalmente, encontrei a resposta que funciona. Obrigado. Além disso, aprendi que 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.
Joe Huang
1
CGFLOAT_MINfoi substituído por CGFloat.leastNormalMagnitudeno Swift 3
Clay Ellis
29

Storyboard:

Basta desmarcar: Adjust Scroll View Insetsnas opções do View Controller

insira a descrição da imagem aqui

Código:

self.automaticallyAdjustsScrollViewInsets = false
Bartłomiej Semańczyk
fonte
2
usando o Xcode 7 Eu não vejo inspetor Atributo> Layout, onde devo adicionar self.automaticallyAdjustsScrollViewInsets = false
alex
em vista foi carregado.
CW0007007
23

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.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}
AndreasLukas
fonte
A segunda página do SO me ajudou .... Eu não sei por que, talvez por causa da AutomaticDimension, talvez por causa das restrições do VFL, de qualquer forma, obrigado! ozi bua ist brav! : D
Pentarex
Estes são os cabeçalhos e rodapés da seção . A questão está relacionada ao cabeçalho da tabela inteira. Além disso, não há nada específico para o Swift3 ou iOS 10 nos dois métodos de delegação (eles estão presentes desde sempre).
Nicolas Miari
14

No meu caso, foi isso que me ajudou. Também estou apoiando o ios6.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}
Lukas
fonte
Não sei o que isso faz, mas funcionou perfeitamente. Você poderia dar uma explicação?
26513 Matt Wolfe
@ MattWolfe Eu estava perdido, e encontrei esta solução, não sei por que isso está acontecendo. Meu palpite é que o controlador está decidindo que a tableview precisa de uma inserção, por causa da barra de status (ou, em outros casos, da barra de ferramentas / tabbar), para que ela seja adicionada automaticamente. Estou realmente lutando com alguns dos novos "recursos" do iOS7. Talvez alguém entenda isso, e tenha uma explicação real sobre isso?
Lukas
Passei os últimos 2 dias portando um aplicativo relativamente pequeno para o iOS 7 e ainda tendo problemas menores. Corrijo-o no ios 7, ele quebra em 6 e vice-versa .. Me deixando louco!
Matt Wolfe
Este é um problema diferente do OP. Mesmo com isso, para exibição de tabela agrupada, um espaço extra é adicionado na parte superior.
RajV 28/10
1
essa parece ser a linha principal: self.automaticallyAdjustsScrollViewInsets = NO; apenas a configuração que removeu o espaço extra que eu tinha.
Mike M
14

Basta adicionar o seguinte ao seu viewDidLoad no seu VC:

self.automaticallyAdjustsScrollViewInsets = NO;
judepereira
fonte
Essa correção funcionou e eu prefiro que defina manualmente as inserções usando números mágicos. Obrigado!
imobilizador 23/05
14

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 tableViewHeaderum UIViewcom pelo menos a 0.01altura trabalhada. CGRectZeronão ajudou, nada realmente ajudou:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
sunshinejr
fonte
10

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:

 self.automaticallyAdjustsScrollViewInsets = false

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.

Vinod Joshi
fonte
10

Graças à resposta de @Aurelien Porte. Aqui está a minha solução

Causa deste problema: -

  1. um 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.
  2. mesmo depois que você atribui uma altura diferente de 0,0 ao seu cabeçalho, um UITableView não gosta de receber um cabeçalho com uma altura de 0,0 no início.

Em ViewDidLoad: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

Não há necessidade de algo assim: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

No heightForHeaderInSectiondelegado: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

No viewForHeaderInSectiondelegado: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}
Ashish Pisey
fonte
10

É 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

Saeed Ir
fonte
1
Trabalhou para mim :)
Bhupinder
Ótimo! Obrigado :)
Saeed Ir
1
Isto é, em vez de automaticallyAdjustsScrollViewInsetsno iOS 11
Nik Kov 05/10
9

Estou assumindo que isso é apenas parte do novo UITableViewStyleGroupedestilo. 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 todos subviewsosUITableView 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):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}
Kevin
fonte
3
Se o UITableViews (para ser mais específico UITableViewCellScrollView) no iOS7 nos ensinou uma coisa, é deixar a hierarquia de exibição das classes integradas em paz.
Matthias Bauch
Bom ponto. A outra opção é ... para manter hackers para cada iOS;)
Dan Rosenstark
Opa, sim. Pretendia escrever esse aviso, mas esqueci.
21413 Kevin
Kevin - Acho que você está certo, isso é por design. Parece que retornar 0 para heightForHeaderInSection é a maneira mais fácil de remover esse preenchimento. Por alguma razão, nessa instância específica, não estava funcionando para mim, mas funciona em outros UITableViews.
esilver
1
É definitivamente "por design". Se você pausou a execução e executou: 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.
Mr. T
9

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

self.navigationController.navigationBar.translucent = YES;

A estrutura definirá automaticamente o contentInset pré-calculado .


Para evitar isso, você pode fazer

self.automaticallyAdjustsScrollViewInsets = NO;

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

zvjerka24
fonte
salva vidas! obrigadaself.automaticallyAdjustsScrollViewInsets = false
ethanneff
8

Esse código funcionou para mim. A melhor resposta para mim, escrita na parte objective-Csuperior, foi convertida em Swift.

Para Swift 4.0 ou superior

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

Basta escrever isso viewDidLoad()e ele funcionará como um encanto.

Vipul Kumar
fonte
1
muito obrigado, funcionou bem para mim.
Ângelo Polotto 9/04
1
sua codificação feliz de boas-vindas
Vipul Kumar 10/04
7

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.

Oded
fonte
Deparou-se com o mesmo problema, não foi capaz de resolvê-lo alterando o contentInset, mas esse método funcionou, mesmo sendo bastante hacky. Pelo que vale a pena, usando a ferramenta de depuração visual, pude ver que, enquanto o UITableView tinha a altura certa, o UITableViewWrapper dentro dele não.
quer
Perfeito. Isso corrigiu o erro para mim, no XCode 6.1. Nenhuma das outras sugestões nesta página do StackOverflow fez alguma diferença. Eu tinha um UITableView dentro de um UIView, e foi a primeira subview. Arrastá-lo para se tornar a segunda subvisão corrigiu-o perfeitamente. (Se alguém precisar de mim, estarei no pub.)
Mike Gledhill
Obrigado! Isso também funciona se você tiver um controlador de exibição de tabela em um contêiner. Mover o contêiner para que não seja o primeiro na visualização dos pais remove a lacuna na parte superior da visualização da tabela.
strangeluck
7

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.

Jiangfan Du
fonte
1
Se eu pudesse, iria votar mais de uma vez. Deve ser uma falha autolayout estranho ou algo assim ... Como nada> 0 obras, eu sugiro que em vez de 0,1 uso FLT_EPSILON ou DBL_EPSILON, já que ambos representam o valor positivo Smalles tal que 1,0 + epsilon = 1.0!
Henri Normak
7

A única coisa que funcionou para mim foi:

Swift :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Objetivo-C :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

Além disso, eu ainda tinha um espaço extra para a primeira seção. Isso foi porque eu estava usando a tableHeaderViewpropriedade incorretamente. Corrigido isso também adicionando:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
Danut Pralea
fonte
Funciona para mim no Swift 4.2. Obrigado
Sylar
Tentei de tudo nesta página, para o iOS13, tableview agrupado com visualização de cabeçalho. self.tableView.tableHeaderView = UIView (quadro: CGRect (x: 0, y: 0, largura: tableView.frame.size.width, height: 0.01)). corrigiu o problema.
Ning
7

Código Swift 4: para tableview sem cabeçalhos de seção, você pode adicionar este código:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

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:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

e a exibição do delegado viewForHeaderinSection.

keerthana manoharan
fonte
Isso não responde à pergunta. A pergunta era sobre de onde vem o espaçamento extra, não como se livrar dele.
Stephen Newell
O estranho é que, se você retornar 0 em heightForHeaderInsection, ainda terá esse espaço extra. Funciona perfeitamente com CGFloat.leastNormalMagnitude (número menos positivo)
ShadeToD
7

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.

insira a descrição da imagem aqui

user832
fonte
Quais são as informações adicionais além da captura de tela em comparação com esta resposta ?
ArtJom B.
acho que é o mesmo, não encontrei essa resposta quando estava procurando uma solução. Devo excluir minha resposta então ..?
usar o seguinte comando
Não, se você puder expandir um pouco sua resposta, descrevendo por que o conteúdo insere = Nunca resolve realmente esse problema (como essa opção funciona?).
Artjom B.
Quando as inserções de conteúdo estão definidas como nunca, o tableView não será exibido na edição do campo de texto.
Mojtaba al moussawi
6

usar este eu acho que isso ajuda ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
Shahzaib Maqbool
fonte
1
Brilhante! Funciona como um encanto no iOS 9.2. Essa resposta é perfeita, pois em alguns casos eu preciso suprimir o primeiro cabeçalho, enquanto em outros o mostramos. Vi outra resposta usando CGFloat.min, que também funciona. Portanto, meu viewController agora pode fornecer um número real como 44.0 ou essencialmente 0. #
David H
6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
AG
fonte
automaticAdjustsScrollViewInsets = trabalho falso de mim! Valeu!
Daniel Kuta