Eliminar separadores extras abaixo do UITableView

714

Quando configuro uma exibição de tabela com 4 linhas, ainda existem linhas separadoras extras (ou células em branco extras) abaixo das linhas preenchidas.

Como eu removia essas células?

imagem para linhas separadoras extras no UITableView

RoundOutTooSoon
fonte

Respostas:

1505

Construtor de interface (iOS 9+)

Basta arrastar um UIView para a tabela. No storyboard, ele fica na parte superior abaixo das células personalizadas. Você pode preferir chamá-lo de "rodapé".

Aqui é mostrado em verde para maior clareza, você provavelmente desejaria cores claras.

Observe que, ajustando a altura, você pode afetar como o "salto inferior" da tabela é tratado, como preferir. (A altura zero geralmente é boa).

insira a descrição da imagem aqui


Para fazer isso programaticamente:

Rápido

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.tableFooterView = UIView()
}

Objetivo-C

iOS 6.1 ou superior

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

ou se você preferir,

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

Historicamente no iOS:

Adicionar ao controlador de exibição de tabela ...

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
     // This will create a "invisible" footer
     return CGFLOAT_MIN;
 }

e se necessário ...

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{        
    return [UIView new];

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}
J. Costa
fonte
Acho que suas descrições e seu código estão invertidos. Enfim, isso funcionou muito bem para mim. Eu só uso rodapés "reais" com tabelas agrupadas, então adicionei if (tableView.style! = UITableViewStyleGrouped) {} ​​ao redor do seu código. Agora, todas as minhas tabelas não agrupadas perdem suas células extras, enquanto minhas tabelas agrupadas não são afetadas.
Arlomedia 31/08/2012
Seguindo minha observação acima, adicionarei um aviso de que, se você colocar alguma condição no método viewForFooterInSection, verifique se o método retorna UIView ou nil. Se você acidentalmente retornar nulo, seu aplicativo falhará!
Arlomedia 5/09/12
4
@Mathieu Isso funciona porque se a tabela tiver um rodapé personalizado, ela não criará linhas "fantom" para preencher a visualização da tabela. Assim, você criará uma visualização vazia para ser usada como rodapé e definirá a altura para próximo de 0 (não pode ser zero ou o iOS não será renderizado). Com esse truque simples, você mudará o comportamento padrão.
22313 Costa J.
2
@ j.Costa: Sua solução funcionará apenas uma vez enquanto a uitableview for criada. depois de clicar na última célula, sua solução não é mais boa. por favor melhore sua resposta.
3
Usar tableFooterViewdeixa um separador na última célula da linha, pois a tabela ainda antecipa o conteúdo abaixo dessa célula. Usar o caminho histórico eliminará o último separador e parecerá melhor em geral.
James Kuang
128

Aqui está outra maneira de fazer isso sem o estilo de tabela agrupada, e uma que você provavelmente não adivinharia. A adição de um cabeçalho e rodapé à tabela (talvez um ou outro seja suficiente, não foi verificado) faz com que os separadores desapareçam das linhas de preenchimento / em branco.

Eu me deparei com isso porque queria um pouco de espaço na parte superior e inferior das mesas para diminuir o risco de pressionar os botões em vez de uma célula da mesa com dedos carnudos. Aqui está um método para inserir uma exibição em branco como cabeçalho e rodapé. Use a altura que desejar, mas você ainda elimina as linhas separadoras extras.

- (void) addHeaderAndFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.myTableView setTableHeaderView:v];
    [self.myTableView setTableFooterView:v];
    [v release];
}

Em resposta ao @Casebash, voltei ao código no meu aplicativo (Gerenciador de listas "AcmeLists" na loja iTunes ...) e coloquei um curto-circuito no método addHeaderAndFooter para verificar. Sem ele , tenho os separadores de linha extras; com o código, eu tenho o que você vê nesta janela: não há imagem dos separadores de linhas da tabela . Portanto, não sei por que não teria funcionado para você. Além disso, faz sentido para mim que ter qualquer rodapé personalizado em uma exibição de tabela necessariamente precise parar de desenhar separadores de linhas para linhas em branco abaixo dele. Isso seria horrível. Para referência, observei as tabelas em que havia mais linhas do que as que podiam ser exibidas na tela e, em seguida, uma tabela com duas linhas. Nos dois casos, não há separadores estranhos.

Talvez suas visualizações personalizadas não tenham sido realmente adicionadas. Para verificar isso, defina a cor do plano de fundo para algo diferente de clearColor, por exemplo [UIColor redColor],. Se você não encontrar algumas barras vermelhas na parte inferior da mesa, seu rodapé não estava definido.

wkw
fonte
1
Você também pode fazer isso no IB. Basta arrastar um UIView na parte inferior da TableView e definir a altura para 1.
Ortwin Gentz
70

Removendo linhas separadoras extras para linhas vazias no UITableView no Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}
dineshthamburu
fonte
34

Gostaria de estender a resposta wkw :

Simplesmente adicionar apenas rodapé com altura 0 fará o truque. (testado no sdk 4.2, 4.4.1)

- (void) addFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];

    [self.myTableView setTableFooterView:v];
}

ou ainda mais simples - onde você configura sua tableview, adicione esta linha:

//change height value if extra space is needed at the bottom.
[_tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)]];

ou ainda mais simples - para simplesmente remover qualquer separador:

[_tableView setTableFooterView:[UIView new]];

Graças a wkw novamente :)

Guntis Treulands
fonte
Esta é a resposta certa, coz em outros métodos última linha permanecem sem separador de linha
Ankush
22

Para iOS 7 ou superior, usando Storyboards

Basta arrastar um UIViewpara o seu UITableViewcomo rodapé. Defina a altura da vista do rodapé como 0.

Kyle Clegg
fonte
18

Tente isso. Funcionou para mim:

- (void) viewDidLoad
{
  [super viewDidLoad];

  // Without ARC
  //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}
Ambili B Menon
fonte
14

Para Swift:

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView()
    }
Sebastian
fonte
11

Se você estiver usando o Swift, adicione o seguinte código para viewDidLoad do controlador que gerencia a visualização da tabela:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView()
}
Babatunde Adeyemi
fonte
8

Você pode simplesmente adicionar um rodapé vazio no final para ocultar as células vazias, mas também parecerá bastante feio:

tableView.tableFooterView = UIView()

insira a descrição da imagem aqui

Existe uma abordagem melhor: adicione uma linha de 1 ponto no final da visualização da tabela, pois o rodapé e as células vazias também não serão mais exibidas.

let footerView = UIView()
footerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1)
footerView.backgroundColor = tableView.separatorColor
tableView.tableFooterView = footerView

insira a descrição da imagem aqui

Darko
fonte
Entrada muito boa, no entanto, não há necessidade de criar sua última célula com uma cor separadora grossa na parte inferior; em vez disso, apenas a mesma cor de fundo da célula e ela também desaparece.
Gustavo Baiocchi Costa
No entanto você prefere. Mas acho que o separador meio "não concluído" parece bastante feio.
Darko 29/05
7

basta adicionar este código ( Swift ). .

tableView.tableFooterView = UIView()
Roy
fonte
1
Duplicar de muitas respostas, incluindo a resposta superior wiki e resposta Sebastian
Cœur
7

Avançando a solução de J. Costa: Você pode fazer uma alteração global na tabela colocando esta linha de código:

[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];

dentro do primeiro método possível (geralmente em AppDelegate, em: application:didFinishLaunchingWithOptions:método).

o.shnn
fonte
2
Cuidado com este, há casos em que o rodapé pretendido pode ser substituído e você passará um dia ou dois questionando sua sanidade. Além disso, tableFooterView não está marcado com UI_APPEARANCE_SELECTOR, portanto o comportamento real pode mudar a qualquer momento.
22615 mwright
6

Eu sei que esta pergunta foi aceita como resposta, mas coloquei aqui maneiras diferentes de como ocultar a linha separadora extra de UITableView .

Você pode ocultar tableViewa linha separadora padrão e adicionar sua linha personalizada na parte superior de cada célula.

Atualizar:

A maneira mais fácil de adicionar separador personalizado é adicionar UIView1px de altura simples :

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

OU

    self.tblView=[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,370) style:UITableViewStylePlain];
    self.tblView.delegate=self;
    self.tblView.dataSource=self;
    [self.view addSubview:self.tblView];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.tblView setTableHeaderView:v];
    [self.tblView setTableFooterView:v];
    [v release];

OU

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // This will create a "invisible" footer
    return 0.01f;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    // To "clear" the footer view
    return [[UIView new] autorelease];
}

OU A melhor e mais simples maneira que eu gosto é

self.tableView.tableFooterView = [[UIView alloc] init];

Tente qualquer um deles;

iPatel
fonte
6

Você pode encontrar muitas respostas para essa pergunta. A maioria deles manipula UITableViewo tableFooterViewatributo s e essa é a maneira correta de ocultar linhas vazias. Para maior conveniência, criei uma extensão simples que permite ativar / desativar linhas vazias no Interface Builder. Você pode conferir a partir deste arquivo essencial . Espero que possa economizar um pouco do seu tempo.

extension UITableView {

  @IBInspectable
  var isEmptyRowsHidden: Bool {
        get {
          return tableFooterView != nil
        }
        set {
          if newValue {
              tableFooterView = UIView(frame: .zero)
          } else {
              tableFooterView = nil
          }
       }
    }
}

Uso:

tableView.isEmptyRowsHidden = true

insira a descrição da imagem aqui

Stanislau Baranouski
fonte
5

linha separadora extra uitableview ocultar linhas separadoras extras ocultar no swift 3.0

 self.tbltableView.tableFooterView = UIView(frame: .zero)
Parth Changela
fonte
5

Se você não deseja nenhum separador após a última célula, precisará de uma altura próxima a zero, mas diferente de zero, para o rodapé.

No seu UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
Cœur
fonte
1
excelente! Trabalhou para mim !!
Antony Raphel 17/05/19
5

Swift funciona muito bem com:

tableView.tableFooterView = UIView()
Marcelo Gracietti
fonte
3

Basta adicionar uma visualização com a cor desejada do separador como cor de fundo, 100% de largura, 1px de altura na posição x0 y-1 ao seu tableViewCell. Certifique-se de que o tableViewCell não recorte subvisões, mas o tableView deve.

Assim, você obtém um separador absoluto simples e funcional apenas entre as células existentes, sem nenhum hack por código ou IB.

Nota: Em um salto superior vertical, o 1º separador aparece, mas isso não deve ser um problema, pois é o comportamento padrão do iOS.

maaalex
fonte
3

Eu estava usando uma exibição de tabela para mostrar um número fixo de linhas de altura fixa, então simplesmente a redimensionei e a tornei não rolável.

Casebash
fonte
3

Para eliminar linhas separadoras extras da parte inferior da UItableview programaticamente, basta anotar as duas linhas de código a seguir e ele removerá o separador extra.

tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;

Esse truque funciona para mim o tempo todo, tente você mesmo.

Kalpesh Panchasara
fonte
2

Tive sorte em implementar uma única parte da resposta aceita (iOS 9+, Swift 2.2). Eu tentei implementar:

self.tableView.tableFooterView = UIView(frame: .zero)

No entanto, não houve efeito no meu tableView- acredito que possa ter algo a ver com o fato de estar usando UITableViewController.

Em vez disso, só tive que substituir o viewForFooterInSectionmétodo (não configurei o tableFooterViewoutro lugar):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

Isso funcionou bem para uma tableViewseção única (se você tiver várias seções, precisará especificar a última).

BAP
fonte
2

Se você tiver apenas uma seção, a maneira mais rápida e fácil é simplesmente definir o Estilo de exibição de tabela de "Simples" para "Agrupado". (veja a imagem)

TableView agrupado

Se você tiver mais seções, pode ser necessário definir a altura do cabeçalho como zero (dependendo do gosto do seu / do seu cliente / do seu gerente de projeto)

Se você tiver mais seções e não quiser mexer com os cabeçalhos (mesmo que seja apenas uma linha no caso mais simples), será necessário definir um UIView como rodapé, conforme explicado nas respostas anteriores.

Gefilte Fish
fonte
2

Extensão Swift 4.0

Apenas uma pequena extensão para o storyboard:

insira a descrição da imagem aqui

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}
Nik Kov
fonte
2

Rápido e fácil Swift 4 way.

override func viewDidLoad() {
     tableView.tableFooterView = UIView(frame: .zero)
}

Se você está tendo células estáticas. Você também pode desligar o separador na janela Inspetor. (isso não será desejável se você precisar do separador. Nesse caso, use o método mostrado acima) janela do inspetor

Alix
fonte
A configuração de um novo UIView como tableFooterView já foi respondida 10 vezes, com explicações melhores sobre o porquê, um código melhor (está faltando super.viewDidLoad()) e está incluída na resposta da wiki na parte superior. Quanto à remoção de todos os separadores, não é realmente sobre o assunto desta pergunta; é melhor reverter sua última edição e / ou excluir completamente sua resposta.
Cœur
1

Se você deseja remover o espaço indesejado no UITableview, pode usar abaixo dois métodos

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}
Hari c
fonte
1

Adicionei esta pequena extensão de tableview que ajuda a

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}
Suresh Varma
fonte
1

Tente com isso

para o objetivo C

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

para Swift

override func viewDidLoad() {
 super.viewDidLoad()
 self.yourTableView.tableFooterView = UIView()
}
Atanu Mondal
fonte
0

Tente isto

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
vishnu
fonte
0

UIKitnão cria uma célula vazia quando tableViewpossui um tableFooterView. Assim, podemos fazer um truque e atribuir um UIViewobjeto de altura zero como rodapé do tableView.

tableView.tableFooterView = UIView()
iMuzahid
fonte
0

Caso você tenha um searchbarem view(para limitar o número de resultados, por exemplo), você também deve adicionar o seguinte em shouldReloadTableForSearchStringeshouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];
user3900346
fonte
0

No Swift (estou usando 4.0), você pode fazer isso criando uma UITableViewCellclasse personalizada e overridingo setSelectedmétodo Então o separator insetstodo para 0 . (minha classe principal com a exibição de tabela tem um fundo claro) cor.

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // eliminate extra separators below UITableView
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
Hoptown
fonte