Reduzindo o espaço entre as seções do UITableView


141

Existe uma maneira de reduzir o espaço entre duas seções de um UITableView? Existem cerca de 15 pixels entre cada seção que tenho. Eu já tentei retornar 0 para -tableView:heightForFooterInSection:e -tableView:heightForHeaderInSection:mas isso não muda nada.

Alguma sugestão?


1
Eu estava usando um tableView agrupado e definindo a altura do cabeçalho / rodapé para 0.0. Mas estava mostrando uma área cinza com uma altura (padrão) de 30 pontos. O uso 0.0é inaceitável. você deve usar qualquer valor acima, 0.0por exemplo 0.0001.
Mel

Como @Honey diz 0.0não funciona. Eu tenho uma resposta mais completa para o mesmo problema aqui: stackoverflow.com/a/22185534/2789144
James Nelson

Respostas:


263

Foi um pouco complicado, mas tente este código:

- (CGFloat)tableView:(UITableView*)tableView 
           heightForHeaderInSection:(NSInteger)section {
    if (section == 0) {
        return 6.0;
    }

    return 1.0;
}

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

- (UIView*)tableView:(UITableView*)tableView 
           viewForHeaderInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

- (UIView*)tableView:(UITableView*)tableView 
           viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

Mude os valores de acordo. Para remover o espaço, acho que 0,0 não será aceito. O menor valor são parece ser 1.0.


2
Você deve retornar 5.0f em vez de 5.0, por causa de duplas - conflitos flutuador
Leons

45
Você pode retornar 0,00001f como uma altura e obter uma altura de 0 pixels / pontos.
Klaas

1
Como o @Klass aponta, você não pode usar 0como altura - você obterá a altura padrão.
zekel

26
Por que não usar CGFLOAT_MIN? É feito para este tipo de cenários :)
Andrei Filip

12
Se estiver usando rápida, você pode voltarCGFloat.leastNonzeroMagnitude
oztune

140

Para todos os que desejam diminuir a distância para 0, é necessário usar:

tableView.sectionHeaderHeight = 0.0;
tableView.sectionFooterHeight = 0.0;

Como a veiculação do UITableViewDelegate produz apenas um efeito a partir de flutuadores maiores que zero.

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


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

-(UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
}

-(UIView*)tableView:(UITableView*)tableView viewForFooterInSection:(NSInteger)section
{
    return [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
}

(usando o iOS 4.1 com XCode 4.0.2)


7
retornar 0,0001; está trabalhando para mim. Estou usando o xcode 4.6 e o ​​iOS 6.1 #
Sam

Eu só preciso retornar CGFLOAT_MIN nos dois primeiros métodos e ele funciona bem.
Julius

em vez de usar 0return .leastNormalMagnitude
stan

33

Você pode realmente definir as alturas do rodapé / cabeçalho / célula no Interface Builder na guia tamanho. Por padrão, o cabeçalho / rodapé é definido em 10.0.


Acho que esse comportamento foi adicionado no iOS 5.0 ou iOS 6.0, mas sim - agora é muito mais fácil configurar a distância entre os grupos.
Vlas Voloshin

2
Eu sei que isso é antigo, mas eu gostaria de comentar que, a partir do XCode 5 e iOS 7, parece que isso deve ser feito em código. Eu configurá-lo no construtor de interface a 0 e ainda foi definido como 1 até que eu colocá-lo em código para 0.
Ahmad

Com o Xcode 6 e o ​​iOS 8, parece estar funcionando apenas com a configuração no storyboard.
Murray Sagal

eles estão definidos como 18 no xcode 7 por padrão. mas essa é de longe a solução mais fácil!
static0886

27

Você deve reduzir a altura do cabeçalho / rodapé da seção. Então o espaço entre as seções será reduzido.

tente este código

Funciona para mim :-)

tableView.sectionHeaderHeight = 2.0;
tableView.sectionFooterHeight = 2.0;

21

Você também pode reduzir a altura do rodapé e do cabeçalho da seção do storyboard. Na tableview -> inspetor de tamanho. Vá para a seção Altura.

Inspetor de tamanho para UITableView no storyboard.

Por padrão, é definido como 22 para tabela de estilo simples e 10 para tabela de estilo agrupado. Você pode configurar valores aumentando / diminuindo os valores do cabeçalho e rodapé separadamente.


6

Para mim, o problema foi porque eu estava usando um estilo de exibição de tabela agrupada ( UITableViewStyleGrouped). Quando mudei para um estilo simples ( UITableViewStylePlain), meu tableView:heightForHeaderInSection:método foi a única coisa que determinou o tamanho de cada cabeçalho de seção.


4

Use isso talvez, 0 não funcionará conforme o esperado

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

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

3

ATUALIZAÇÃO PARA iOS7: devido à atualização de autorelease do ARC, aqui está o código de @Martin Stolz editado.

-(CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section
{
    if(section == 0)
        return 6;
    return 1.0;
}

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

-(UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
}

-(UIView*)tableView:(UITableView*)tableView viewForFooterInSection:(NSInteger)section
{
    return [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
}

(Usando iOS7, Xcode v5.0)


0

Para mim, apenas esse problema foi resolvido usando o código a seguir,

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return section == 0 ? 1 : 20 // 20 is my other sections height
}

O retorno de 1 para a primeira seção resolveu o problema.


0

Para alterar o espaço do cabeçalho / rodapé, os seguintes métodos devem ser implementados:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

E

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

(use os métodos correspondentes para alterar a altura do rodapé)

O código a seguir remove completamente os espaços em torno das seções:

public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    return nil
}

public func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return nil
}

public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNonzeroMagnitude
}

public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return .leastNonzeroMagnitude
}
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.