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

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


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.


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)

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


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!


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
}

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.


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


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


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.


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);

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;

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

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
}

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;
}

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;

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

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.


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 
}

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


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];
    }
}

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


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.


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.


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.


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

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.


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


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

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
        }

automaticAdjustsScrollViewInsets = trabalho falso de mim! Valeu!
Daniel Kuta
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.