Réduire l'espace entre les sections de UITableView

141

Existe-t-il un moyen de réduire l'espace entre deux sections d'un UITableView? Il y a environ 15 pixels entre chaque section que j'ai. J'ai déjà essayé de renvoyer 0 pour -tableView:heightForFooterInSection:et -tableView:heightForHeaderInSection:mais cela ne change rien.

Aucune suggestion?

flohei
la source
1
J'utilisais un tableau groupé et définissais la hauteur de l'en-tête / pied de page sur 0.0. Mais il montrait une zone grise avec une hauteur (par défaut) de 30 points. L'utilisation 0.0n'est pas acceptée. vous devez utiliser n'importe quelle valeur ci-dessus, 0.0par exemple 0.0001.
Honey
Comme le dit @Honey, 0.0cela ne fonctionne pas. J'ai une réponse plus détaillée pour le même problème ici: stackoverflow.com/a/22185534/2789144
James Nelson

Réponses:

263

C'était un peu délicat, mais essayez ce code:

- (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];
}

Modifiez les valeurs en conséquence. Pour supprimer l'espace, je pense que 0.0 ne sera pas accepté. La plus petite valeur raisonnable semble être 1,0.

Aux hommes
la source
2
Vous devriez retourner 5.0f au lieu de 5.0, en raison de conflits à double flottant
LeonS
45
Vous pouvez même renvoyer 0,00001f comme hauteur et vous obtiendrez une hauteur de 0 pixels / points.
Klaas
1
Comme @Klass le souligne, vous ne pouvez pas utiliser 0comme hauteur - vous obtiendrez la hauteur par défaut.
zekel
26
Pourquoi ne pas utiliser CGFLOAT_MIN? C'est fait pour ce genre de scénarios :)
Andrei Filip
12
Si vous utilisez Swift, vous pouvez revenirCGFloat.leastNonzeroMagnitude
oztune
140

Pour tous ceux qui veulent réduire la distance à 0, vous devez utiliser:

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

Parce que la diffusion de UITableViewDelegate ne produit qu'un effet à partir de flottants supérieurs à zéro.

-(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];
}

(en utilisant iOS 4.1 avec XCode 4.0.2)

Martin Stolz
la source
7
retourne 0,0001; travaille pour moi. J'utilise xcode 4.6 et iOS 6.1
Sam
Je n'ai besoin que de retourner CGFLOAT_MIN dans les deux premières méthodes et cela fonctionne très bien.
Julius
au lieu de 0 utilisationreturn .leastNormalMagnitude
stan
33

Vous pouvez en fait définir les hauteurs de pied de page / d'en-tête / de cellule dans Interface Builder sous l'onglet Taille. Par défaut, l'en-tête / pied de page est défini sur 10,0.

Chris
la source
Je pense qu'un tel comportement a été ajouté dans iOS 5.0 ou iOS 6.0, mais oui - il est maintenant beaucoup plus facile de configurer la distance entre les groupes.
Vlas Voloshin
2
Je sais que c'est vieux, mais je voulais dire qu'à partir de XCode 5 et iOS 7, il semble que cela DOIT être fait dans le code. Je l'ai défini dans le constructeur d'interface sur 0 et il était toujours défini sur 1 jusqu'à ce que je le définisse dans le code sur 0.
Ahmad
Avec Xcode 6 et iOS 8, il semble fonctionner uniquement avec la configuration du storyboard.
Murray Sagal
ils sont définis sur 18 sur xcode 7 par défaut. mais c'est de loin la solution la plus simple!
static0886
27

Vous devez réduire la hauteur de l'en-tête / pied de page de la section. Ensuite, l'espace entre les sections sera réduit.

essayez ce code

Ça marche pour moi :-)

tableView.sectionHeaderHeight = 2.0;
tableView.sectionFooterHeight = 2.0;
Jirune
la source
21

Vous pouvez également réduire la hauteur du pied de page et de l'en-tête de section à partir du storyboard. Dans le tableauview -> inspecteur de taille. Allez à Hauteur de la section.

Inspecteur de taille pour UITableView dans le storyboard.

Par défaut, il est défini sur 22 pour le tableau de style simple et 10 pour le tableau de style groupé. Vous pouvez configurer des valeurs en augmentant / diminuant les valeurs de l'en-tête et du pied de page séparément.

iosCurator
la source
6

Pour moi, le problème était dû au fait que j'utilisais un style de vue de tableau groupé ( UITableViewStyleGrouped). Quand je l'ai changé pour un style simple ( UITableViewStylePlain), ma tableView:heightForHeaderInSection:méthode était la seule chose qui déterminait la taille de chaque en-tête de section.

Liron Yahdav
la source
4

Utilisez ceci peut-être, 0 ne fonctionnera pas comme prévu

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

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

MISE À JOUR POUR iOS7: En raison de la mise à jour automatique de ARC, voici le code @Martin Stolz modifié.

-(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)];
}

(Avec iOS7, Xcode v5.0)

Chisx
la source
0

Pour moi, ce problème a été résolu simplement en utilisant le code suivant,

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

Le renvoi de 1 pour la première section a résolu le problème.

Bharat
la source
0

Pour modifier l'espace d'en-tête / pied de page, les méthodes suivantes doivent être implémentées:

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

ET

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

(utilisez les méthodes correspondantes pour modifier la hauteur du pied de page)

Le code suivant supprime complètement les espaces autour des sections:

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
la source