Remova o espaço vazio antes das células no UITableView

172

Atualmente, estou tentando colocar um UITableView em um local diferente, e não na parte superior do meu controlador de exibição. Com isso dito, ele está tentando adicionar o cabeçalho na parte superior para dar conta da barra de navegação, mas isso não é necessário, pois eu não tenho na parte superior do meu controlador.

Se eu colocar o canto superior esquerdo de UITableViewonde eu quero que as células estejam, ele não colocará as células lá:

Agora, se eu apenas mover a visualização da tabela para cima para que as células estejam no lugar correto, eu tenho um problema diferente - as células podem ser movidas para lá durante a rolagem (isso é com meu dedo acima do controlador de navegação):

Quando eu solto, sim - as células vão logo abaixo da barra de pesquisa, mas isso é obviamente um problema de como você pode colocá-las acima dela.

Como eu faria isso? Existe alguma maneira mais fácil?

hetelek
fonte

Respostas:

378

As células do UITableViewprograma estão no espaço vazio quando você rola para baixo?

Nesse caso, o problema pode ser a inserção adicionada ao UITableView controlador de navegação que você tem em sua exibição. A inserção é adicionada à visualização da tabela para que o conteúdo seja colocado abaixo da barra de navegação quando nenhuma rolagem ocorreu. Quando a tabela é rolada, o conteúdo rola e é exibido sob uma barra de navegação transparente. Obviamente, esse comportamento é desejado apenas se a exibição da tabela iniciar diretamente sob a barra de navegação, o que não é o caso aqui.

Outro aspecto a ser observado é que o iOS ajusta o conteúdo inserido apenas para a primeira visualização na hierarquia de visualizações, se é UIScrollViewou é descendente (por exemplo, UITableViewe UICollectionView). Se sua hierarquia de visualizações incluir várias visualizações de rolagem, automaticallyAdjustsScrollViewInsetsfará ajustes apenas na primeira.

Veja como alterar esse comportamento:

a) Construtor de interface

  • Selecione o controlador de exibição
  • Inspetor de atributos abertos
  • Há uma propriedade chamada "Ajustar inserções de exibição de rolagem" no inspetor de atributos do IB (quando um controlador de exibição é selecionado) que está ativado por padrão. Desmarque esta opção:


    (Imagem cortesia de Dheeraj D )

Não tenho certeza de qual versão do Xcode introduziu essa opção (não a localizou nas notas de versão), mas está disponível pelo menos na versão 5.1.1.

Edit: Para evitar confusão, esta foi a terceira opção mencionada nos comentários

b) programaticamente

Adicione isto a ie viewDidLoad(créditos à resposta de Slavco Petkovski e comentário de Cris R )

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) Isso pode ser relevante para os alunos mais velhos

Você pode corrigir isso adicionando

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

Ou se você estiver usando IB e se a barra de navegação não for transparente (não é possível distinguir na captura de tela)

  • Selecione o controlador de exibição
  • Inspetor de atributos abertos
  • Na seção Opções do Controlador de exibição, estender arestas, desmarque "Abaixo das barras superiores"
lekksi
fonte
2
Desmarcar "Under Top Bars" no UIView funcionou muito bem para mim. Obrigado.
Andreas Øverland
Eu estava enlouquecendo usando "Paging ativado" e a rolagem mudando apenas pela altura da barra de navegação em vez da célula inteira. Obrigado.
precisa saber é o seguinte
8
A terceira opção: desmarque a opção "Ajustar inserções da exibição de rolagem" - funcionou como um encanto. obrigado lekksi!
Stas Zhukovskiy
2
self.automaticallyAdjustsScrollViewInsets = false no Swift trabalhando "de pelos"!
Cris R
1
É necessário definir UIEdgeInsetsZero para reutilizar uma tabela em um novo controlador de tabela sempre que mostrado, caso contrário, o mesmo espaço em branco aparece e fica cada vez maior.
malhal
71

Eu tive esse mesmo problema e tenho certeza de que tive um UIView lá em um ponto. Simplesmente copiar toda a exibição da tabela, excluí-la e colar novamente a corrigiu.

irblue
fonte
7
isso é realmente muito estranho. Isso resolveu o problema. Alguma idéia de quando isso acontece?
MiQUEL 27/10/2013
Eu acho que você pode resolvê-lo muito mais facilmente, seguindo a minha resposta de 10/10/2013
netshark1000
Teve o mesmo problema. Removê-lo e ler também funcionou para mim.
Sma
3
Tanto quanto eu sei, as inserções de conteúdo da exibição por rolagem são ajustadas automaticamente (se automaticamenteAdjustsScrollViewInsets = YES, que é por padrão) somente se a exibição por rolagem for o primeiro filho na hierarquia da exibição do controlador de exibição. Meu palpite é que essa solução funcione porque, após copiar e colar a exibição da tabela, ela não é mais a primeira exibição na hierarquia da exibição.
Lekksi
O que acontece é que, quando o tableView é a primeira coisa que você adiciona à visualização, o sistema pensa que precisa deixar espaço para a navegação. Meu palpite aqui é que algumas pessoas adicionam o tableView e, em seguida, o headerView. Após alguns problemas, eles removem o tableView e o adicionam novamente, o que acontece é que o headerView é a primeira coisa na hierarquia, para que o sistema não precise mais se adaptar, problema resolvido. Eu sei porque eu só uso código, então no meu caso tive que adicionar primeiro o cabeçalho e depois a tabela para corrigi-lo.
Lluis Gerard
40

Selecione a tableview no seu storyboard e verifique se o estilo está definido como "Simples", em vez de "Agrupado". Você pode encontrar essa configuração na guia Inspetor de atributos.

netshark1000
fonte
incrível .. essa foi a solução para mim estranhamente .. apenas copiei e colei todo o controlador de exibição, mas de alguma forma esse tableView do controlador de exibição colado tinha esse deslocamento estranho. Esta resposta resolveu meu problema
Daisura99
Isso resolveu o problema, mas agora as seções do cabeçalho se comportam de maneira diferente. Qualquer um?
Bruno Muniz
Saúde. Onde quer que você esteja neste mundo. Abençoe você para sempre.
gabuchan
9

No meu caso, eu tinha um UILabel na hierarquia do UITableView.

Movi-o "para frente" e o espaço em branco apareceu. Não sei por que, mas funciona assim, se houver algo sob o tableView, oculta o espaço em branco.

Além disso, você pode tentar marcar / desmarcar "Ajustar inserções de exibição de rolagem" no inspetor do controlador de exibição no storyboard.

insira a descrição da imagem aqui

Andre Cytryn
fonte
2
Eu tenho um UITableView agrupado e desmarcando "Ajustar inserções de exibição de rolagem" funcionou.
Matt
5

Nenhuma das opções acima me ajudou. mas fazer isso ajudou :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

em vez de '-64', você pode colocar qualquer outro número, dependendo da altura da sua barra de navegação.

Tung Fam
fonte
4

Pode ser pré-adicionado UIRefreshControl. Eu tenho esse problema com código como este:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

Como você vê, eu defino self.refreshControllerimediatamente apósinit

Mas, se você definir refreshControlapós a instalação, o espaço superior não o interferirá.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}
akaDuality
fonte
Não acredito que esse era o problema real. É apenas um problema para mim em <= 9.3.5. Como você descobriu isso?
Sirens
4

Se você estiver fazendo isso no iOS 11, o ajuste automáticoAdJustsScrollViewInsets não funcionará conforme foi descontinuado, o código a seguir funcionou para mim de acordo com a resposta desta postagem: https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

Espero que isto ajude.

Jacobo Koenig
fonte
4

No Storyboard, defina o contentInsetsseu tableviewcomo Nunca

insira a descrição da imagem aqui

Marwen Doukh
fonte
3

Não posso ter certeza, mas parece que você tem um UIView extra preso entre o início das células protótipo e a parte superior do UITableView. Minha imagem se parece exatamente com a sua se você remover o texto / linhas que adicionei.

insira a descrição da imagem aqui

Mike S
fonte
3

Ainda não tenho certeza do que causou esse espaço extra na parte superior, mas achei que excluir o UITableView pelo espaço e substituí-lo por um novo ocupava o espaço.

Devo ter arrastado um UIView para lá acidentalmente, mas não pude selecioná-lo para não excluir.

hetelek
fonte
3

Swift 5

Tente remover tableHeaderView e tableFooterView

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)
Vivek
fonte
2

Verifique seu quadro de tableview no storyboard ou no xib. O meu por padrão tem um valor de posição, daí o bug

Arthi
fonte
2

Na minha aplicação também tive um problema como este. Defina a borda superior inserida do tableView zero. Também tentei definir falsepara automaticallyAdjustsScrollViewInsets. Mas não funcionou.

Finalmente, consegui uma solução funcional. Não sei se é o caminho correto. Mas implementar o heightForHeaderInSectionmétodo delegado funcionou para mim. Você precisa retornar um valor diferente de zero para trabalhar isso (o retorno zero exibirá o mesmo espaço que antes).

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

    return 0.1
}
Anusha Kottiyal
fonte
2

Em 2017, o que está funcionando para mim é simplesmente esta linha

navigationController? .navigationBar.isTranslucent = false

Eu não tenho idéia do por que isso afetaria isso. Talvez alguém possa explicar. Mas tenho certeza de que essa é a resposta que a maioria das pessoas procuraria.

Tempo de Orvalho
fonte
Isso fez isso por mim também. Obrigado!
scurioni
2

No iOS 11 e superior, a apple alterou a propriedade para ajustar a inserção de conteúdo. Use contentInsetAdjustmentBehaviore configure .neverpara remover um espaço extra acima UICollectionView, UIScrollView, UITableView.

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

Eu espero que isso te ajude.

Mayur Karmur
fonte
1

Bem, para mim, o problema ocorreu quando arrastei uma célula protótipo do menu para a exibição de tabela. Excluí isso e apenas defino a célula protótipo como 1 nas propriedades do inspetor de exibição de tabela

Junaid Ahmed
fonte
1

Estou fazendo isso programaticamente e simplesmente movi meu addSubview (tableView) para baixo depois de adicionar todas as minhas outras subvisões, e isso resolveu o meu problema!

Não sei por que isso aparece apenas no dispositivo e não no meu simulador, mas de qualquer forma, pelo menos, existe uma solução simples!

Austin Whitelaw
fonte
1

Enquanto UITableView não for a primeira subvisão do controlador de exibição, o espaço vazio não aparecerá.

Solução: adicione um objeto de visão oculta / clara (visualizações, rótulos, botão etc.) como a primeira subvisualização do controlador de visualização (no mesmo nível que o UITableView, mas antes dele).

jr.ong
fonte
Passei tanto tempo tentando descobrir isso, tentando muitas das sugestões aqui e em outros posts. Este é o único que resolveu. Obrigado! Você pode explicar o porquê ou postar um link para algum documento que o faça? Estou apenas aprendendo o desenvolvedor do iOS e é tão diferente do Android! :)
Marcos
0

O UIView pode ser inserido na parte superior e inferior da tabela (arrastar e soltar). Defina suas propriedades como transparentes e altura de 1 px. Isso é para remover o preenchimento extra na frente das células.

Alexander
fonte
0

Eu também tive esse problema: o tableView não era a última exibição na hierarquia. No meu caso, eu tinha uma visão acima (mesmo que não se sobrepusessem), então a arrastei acima da tableView na hierarquia e ela foi criada.

Sebyddd
fonte
0

Acabei de encontrar uma solução para isso.

Basta selecionar tableview e clique em Editor -> Organizar -> Enviar para a frente

Funcionou para mim e espero que ajude a todos.

Daniel Meza
fonte
0

No meu caso, eu estava usando ContainerViewController e colocando UITableViewController nele. Após remover o ContainerViewController. Os problemas desaparecem.

Sandeep Ahuja
fonte
0

Bug do Xcode 8…

Tente primeiro se o estilo UITableView do Storyboard estiver definido como Simples.

Defina o estilo da tabela como Agrupado e, em seguida, volte para Simples. Isso removeu o espaço no meu aplicativo na cabeça do meu UITableView.

Carl
fonte
0

No meu caso, eu estava usando uma exibição de contêiner. (Main View -> Contaner View -> UITableView)

Acho que o espaço extra na parte superior é como o espaço da barra de notificação do dispositivo (onde a hora é exibida, a bateria). Realmente, não é uma suposição.

O que fiz foi no UI Builder:

  • selecione o Table View Controller completo
  • Inspetor de atributos abertos
  • Vá para -> Exibir controlador -> Layout -> "Selecionar quer tela cheia"
Patricio Diego
fonte
0

Você pode usar esse código em viewDidLoad ou viewDidAppear onde sua tabela está sendo criada:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];
Vinod Joshi
fonte
0

I just found a solution for this. In my case, i was using TabBarViewController, A just uncheck the option 'Adjust Scroll View Insets'. Issues goes away. https://i.stack.imgur.com/vRNfV.png

NitinLandge
fonte
0

defina as bordas estendidas do ViewController no storyboard para que a underTopBarpropriedade seja desmarcada.

JAHelia
fonte
0

Estava tendo o mesmo problema. Eu o resolvi adicionando o seguinte ao viewDidLoad.

self.extendedLayoutIncludesOpaqueBars = true
GIJoeCodes
fonte
-1

Defina as inserções de conteúdo como zero:

sriram neelamegam
fonte
-2

verificar se há

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • mencionar a função de delegado tableview cellForRowAtIndexPath:
  • ele pode manipular os ios 6 e 7.
Manikandan
fonte