UITableView está começando com um deslocamento no iOS 7


115

Arrastei um UITableView de Jane simples para um UIViewController no iOS 7.

Agora há um deslocamento vertical do espaço antes do início da primeira célula. Como faço para me livrar dele? Quero que a primeira linha esteja muito mais próxima da borda superior de onde o UITableView realmente começa. Eu não pedi o grande deslocamento, pedi?

insira a descrição da imagem aqui

Alguma ideia?


43
Fui ajudado pelo seguinte: YouStoryboard.storyboard> YouViewController> Attributes inspector> Uncheck - Adjust scroll view insets.
Alexander,

17
btw, você pode tirar uma captura de tela do simulador iOS usando a tecla Command + S
Hemang

@Alexander: Também fui ajudado com suas sugestões, no entanto, desmarcar ExtendEdges.UnderTopBars fez com que o espaço de deslocamento vertical aparecesse novamente. Não tenho certeza se é um dos (muitos?) Bugs do Xcode6, mas esses problemas me dão muitas dores de cabeça de vez em quando!
iOS-Coder

Respostas:


81

Por padrão, os controladores de visualização da tabela preencherão o conteúdo abaixo da barra de navegação para que você possa rolar o conteúdo abaixo dela e vê-lo, em um estado borrado, abaixo da barra de navegação / barra de ferramentas.

Parece que você está posicionando em 44 (talvez 64) px para movê-lo para fora da barra de navegação, mas já compensa isso, então você obtém uma grande lacuna.

Vá para o storyboard / xib no IB e desmarque o conteúdo do programa em coisas da barra de navegação.


6
Desculpe, como o comentário sobre o NDA no iOS7 é irrelevante? Este é um fórum para ajudar as pessoas.
Cocoadelica de

No Xcode Versão 5.1 no Viewcontroller, desmarque as bordas estendidas> Abaixo das barras superiores para remover a inserção de conteúdo UITableView superior
Emel Elias

3
Então, onde está mostrar o conteúdo na barra de navegação thigo? Eu não consigo encontrar.
Anup Kattel,

10
@FrankGorman no Xcode 5.1.1 há uma opção no storyboard para o controlador de visão específico Adjust Scroll View insets, remova a marca de seleção.
korat prashant

1
hey @koratprashant. comentário muito útil.
KDeogharkar de

107

A nova implementação do iOS 7 de UIViewController tem um novo conjunto de opções que permite ao desenvolvedor escolher se o sistema adicionará automaticamente inserções para UIScrollView , UITableView e derivações.

Para desativar esse comportamento, desmarque essas caixas para todos os UIViewControllers desejados em InterfaceBuilder, no inspetor de objeto selecionado UIViewController :

Ver o inspetor do controlador

Para mais detalhes:

  1. Envie seus aplicativos iOS 7 hoje.
  2. Guia de transição da IU do iOS 7> Aparência e comportamento

Obrigado! Você me salvou.
rsc

68

Guia de transição do iOS7:

Se você não quiser que as inserções de conteúdo da visualização de rolagem sejam ajustadas automaticamente, defina automaticAdjustsScrollViewInsets como NO. (O valor padrão de automaticallyAdjustsScrollViewInsets é YES.)

   self.automaticallyAdjustsScrollViewInsets = NO;

9
Isso também pode ser definido no XCode no inspetor de atributos. Desmarque a Adjust Scroll View Insetscaixa de seleção do layout do controlador de visualização.
Andrew

1
Se você carregar o UIViewController programaticamente (sem usar um XIB), este funcionará perfeitamente. Definido automaticallyAdjustsScrollViewInsets = NOno controlador de visualização.
KabraBoja de

Isso foi tudo para mim. Confuso porque minha TableView estava dentro de uma visualização de contêiner e inicialmente parecia bem. Mas ficou confuso ao voltar de outro controlador de visualização.
n13 01 de

Ótimo! Me poupe muito tempo!
inix

34

Eu tive um problema semelhante, depois de descartar um viewController, o contentOffset do meu tableView foi alterado para (0, -64).

minha solução foi um pouco estranha, tentei todas as outras respostas mas não tive sucesso, a única coisa que resolveu meu problema foi mudar a posição tableView na árvore de controles do .xib

foi o primeiro controle na Visualização pai assim:

antes

Mudei o tableView logo após o ImageView e funcionou:

depois de

parece que colocar a visualização da mesa na primeira posição estava causando o problema e mover a visualização da mesa para outra posição corrigiu o problema.

PD Não estou usando autoLayout nem storyboards

espero que isso possa ajudar alguém!


Eu notei a mesma coisa! Eu não coloco nenhuma vista adicional, mas simplesmente compenso a lacuna movendo o topo do UITableView -44. Em IB, parece que tenho que mover -64px, mas em tempo de execução -64px faz com que tablview se sobreponha à barra de navegação e -44px está OK. Eu não consigo explicar isso. Eu encontrei esse problema na exibição popover do iPad, quando não percebi nenhum problema semelhante no storyboard do iPhone.
Mike Keskinov

Este problema surge mesmo com o uiview. se as visualizações mostradas na interface do usuário não estiverem na mesma ordem.
Rinku de

2
Tive o mesmo problema hoje, com o XCode 6.1. Gaste mais 2-3 horas perdidas, tentando contornar os bugs da Apple ...
Mike Gledhill

3
Isso foi extremamente útil e merece mais atenção! Nenhuma quantidade de mexer nas configurações do controlador de visualização ou inserção / deslocamento de conteúdo ajudou, mas mudar a ordem das visualizações no storyboard resolveu o problema para mim.
Caleb

1
Apple, quero dizer ... WTF? Obrigado cara, isso também corrigiu o storyboard com autolayout.
Borzh de

30

resolve meu problema semelhante:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}

1
Você deve verificar a versão do sistema desta forma, use:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes

Isso funcionou para mim para o problema de espaçamento que eu estava tendo, mas agora meu botão giratório de controle puxar para atualizar aparece parcialmente obscurecido e abaixo do meu menu superior. Alguém viu isso também? Alguma solução alternativa?
Nick

@ nickv2002 tente criar tableView programaticamente
Alex

Eu tentei todas as outras soluções, mas apenas esta funcionou para mim
DanielR

13

Tente usar isto

tableView.separatorInset = UIEdgeInsetsZero;

Obviamente, se você oferece suporte a algo menos do que iOS7, precisará garantir que o objeto responda a esse seletor antes de chamá-lo.


4
não tenho certeza porque isso está sendo votado ... separatorInset apenas altera as linhas de distância entre as células inseridas a partir da borda da visualização. A pergunta é sobre o espaço acima e abaixo das células
Rembrandt Q. Einstein

A imagem é enganosa, mas uma pesquisa comum no Google para o problema de margem produz esta página.
Will

9

Sério, mudar contentOffsetnão é a solução. Você está apenas corrigindo um problema e não corrigindo a causa. Tenho enfrentado o mesmo problema e descobri que tableViews agrupadas têm um preenchimento na parte superior. No meu caso, definir o tipo como normal fez o truque.

Esperançosamente, isso poupa alguns minutos. Z.


1
perdi totalmente, feliz por ter encontrado sua resposta, UPVOTE
AamirR

8

Com o iOS 9, nenhuma das outras respostas desta página funcionou para mim (ou seja, desmarcar as caixas no Storyboard, definir automaticallyAdjustsScrollViewInsetscomo NO).

Minha solução alternativa com a qual estou realmente insatisfeito foi esta:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

As mesmas linhas em viewWillAppearou viewDidLoadforam ineficazes.


Esta deve ser a única resposta para uitableviewcontroller iOS 9 ... realmente, nada mais ajudou, e eu tentei todos eles, onde você encontrou isso ou como você descobriu? muitos 10x
Erez

Desmarcar a Adjust Scroll View insetscaixa de seleção funciona para iOS 9.
Adam

Ajustar as inserções de visualização de rolagem não está funcionando para mim, alguma outra solução?
Yogesh Patel de

5

Às vezes, eu obtenho uma 64lacuna de altura no topo da minha Table View quando o UIViewControllerestá embutido em um Navigation Controller.

insira a descrição da imagem aqui

No passado, eu apenas recriaria tudo, esperando que as restrições ficassem corretas depois de uma lousa em branco.

TIL: Se você não quiser fazer uma restrição vertical para o Top Layout Guide, você pode manter pressionada a Optiontecla para acessar o Container Margin.

insira a descrição da imagem aqui

Em seguida, verifique se a Top Space to Superviewconstante está definida como 0. Isso funcionou para mim, pelo menos.

insira a descrição da imagem aqui


1,5 anos depois, mas isso resolveu minha noite. Obrigado!
asp_net

4

Isso funciona para mim:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

2

Se você adicionar um UIView vazio antes de UITableView (ou qualquer exibição rolável, como ScrollView e TextView), você pode ter uma sorte.


1

Eu tinha um UITableViewController incorporado em uma visualização de contêiner. Para me livrar dos indesejados 64 pontos de espaço vertical, eu precisei desmarcar 'Ajustar Scroll View Insets' no Interface Builder e definir o UITableView's contentInset no viewWillAppear do meu UITableViewController como abaixo.

O tamanho do espaço vertical parece corresponder à altura do quadro da barra de navegação e deslocamento y. O problema ocorreu apenas no iOS 7.

- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}

1

No Xamarin iOS, tive esse problema ocorrendo em um UITableViewController em segundo plano logo após a caixa de diálogo modal em primeiro plano ter sido descartada. No processo de mudança para o primeiro plano, o UITableViewController tinha inserções definidas (em algum lugar pelo iOS):

Esta aula resolveu

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}

1

De vez em quando, volto a essa situação terrível e percebo que ainda é bastante desconhecida. Então, para memória futura ...

Ultimamente, estou corrigindo essa solução alternativa.

  1. Adicione uma subvisualização na parte superior do UITableView, com altura de pixel zero. Funciona com Autolayout ou sem.
  2. Se eu me sentir confiante :-) eu removo essa visão falsa, corrijo as restrições na parte superior e magicamente funciona.

Não me pergunte por quê, ainda acho que é um bug profundo no UIKit.


0

Se você for para o storyboard, poderá alterar o deslocamento selecionando a tabela e, na seção Visualização da tabela no inspetor de atributos, basta alterar as inserções do separador à esquerda para 0.


0

Acho que a solução real é configurar suas restrições superior e inferior no tableview para serem iguais a topMargin e bottomMargin. Não é o guia de layout superior e o guia de layout inferior. Isso permite que você mantenha automaticAdjustsScrollViewInsets verdadeiro.


0

Solução Swift 3:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}

0

Se você embutiu seu TableViewController em um NavigationController ou ContainerView You have to constraint to margins instead of top Layout guide in Storyboard,. Check constraint to margins when you are doing the constraintsNenhuma outra maneira funcionou para mim. Não pude comentar, então estou apenas reiterando a resposta de Robert Chens.


0

Tentei várias das respostas. Alterar as configurações no storyboard causou problemas de ondulação com um menu de sobreposição que aparece da esquerda.

Eu só tenho um UIViewController em branco no storyboard, caso contrário, tudo é gerado programaticamente.

Eu tenho o mesmo problema com um UITableView dentro de um UIView dentro de um UIViewController. Ou seja, os cabeçalhos da seção começam muito para baixo quando o UIViewController é incorporado em um controlador de navegação. Sem o controlador de navegação, tudo funciona bem.

Para corrigir o problema, criei um UILabel e com restrições coloquei a restrição inferior UILabel = a restrição superior do UIView (para que não apareça na tela. Agora com esse controle adicional (o novo Label) o TableView se comporta corretamente.

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true

0

Eu tive o mesmo problema no iOS 11 e xib, UITableviewController e resolvi como abaixo

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
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.