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?

flohei
fonte
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.

Para homens
fonte
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)

Martin Stolz
fonte
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.

Chris
fonte
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;
Jirune
fonte
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.

iosCurator
fonte
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.

Liron Yahdav
fonte
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
}
stan
fonte
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)

Chisx
fonte
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.

Bharath
fonte
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
}
Murlakatam
fonte