Comment changer la hauteur de l'en-tête UITableView groupé?

88

Je sais comment modifier la hauteur des en-têtes de section dans la vue tableau. Mais je ne trouve aucune solution pour modifier l'espacement par défaut avant la première section.

En ce moment, j'ai ce code:

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

entrez la description de l'image ici

circuitlego
la source
1
stackoverflow.com/questions/5441938/… Voir ce lien ...
Jitendra
@JitendraDeore Merci de m'avoir guidé dans la bonne direction
circuitlego

Réponses:

219

Retournez CGFLOAT_MINau lieu de 0 pour la hauteur de section souhaitée.

Le retour de 0 oblige UITableView à utiliser une valeur par défaut. Il s'agit d'un comportement non documenté. Si vous renvoyez un très petit nombre, vous obtenez en fait un en-tête de hauteur nulle.

Swift 3:

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

Rapide:

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return CGFloat.min
    }
    return tableView.sectionHeaderHeight
}

Obj-C:

    - (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 0)
        return CGFLOAT_MIN;
    return tableView.sectionHeaderHeight;
}
Mark Krenek
la source
8
Dans Swift, 'CGFLOAT_MIN' n'est pas disponible: utilisez plutôt CGFloat.min.
tounaobun
4
CGFloat.min a causé un crash, car CGFloat.min renvoie une valeur négative comme -0,0000000000001
Pavel Gatilov
2
C'est peut-être du pédantisme, mais CGFloat.min n'est pas un très petit nombre, c'est un très grand nombre négatif. Si vous vouliez un très petit nombre, vous utiliseriez epsilon.
alex bird le
6
Dans Swift 3 c'estCGFloat.leastNormalMagnitude
ixany
1
Conseil: n'utilisez pas cette valeur estimatedHeightForHeaderInSection, l'application plantera.
Pedro Paulo Amorim
27

Si vous utilisez le tableViewstyle groupé , tableViewdéfinissez automatiquement les incrustations supérieures et inférieures. Pour les éviter et éviter les paramètres internes d'inserts, utilisez des méthodes de délégation pour l'en-tête et le pied de page. Ne retournez jamais 0.0 maisCGFLOAT_MIN .

Objectif c

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    // Removes extra padding in Grouped style
    return CGFLOAT_MIN;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // Removes extra padding in Grouped style
    return CGFLOAT_MIN;
}

Rapide

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    // Removes extra padding in Grouped style
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    // Removes extra padding in Grouped style
    return CGFloat.leastNormalMagnitude
}
Jakub Truhlář
la source
J'ai également dû renvoyer nul pour viewForHeaderInSectionque l'en-tête disparaisse complètement.
Dominik Seemayr
19

Il semble que je ne puisse pas définir une vue d'en-tête de tableau avec une hauteur de 0. J'ai fini par faire ce qui suit:

- (void)viewWillAppear:(BOOL)animated{
    CGRect frame = self.tableView.tableHeaderView.frame;
    frame.size.height = 1;
    UIView *headerView = [[UIView alloc] initWithFrame:frame];
    [self.tableView setTableHeaderView:headerView];
}
circuitlego
la source
Ce serait préférable de régler la hauteur ici:- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 1.0f; }
uniruddh
19

Cela a fonctionné pour moi avec Swift 4 . Modifiez votre UITableViewpar exemple dans viewDidLoad:

// Remove space between sections.
tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

// Remove space at top and bottom of tableView.
tableView.tableHeaderView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: CGFloat.leastNormalMagnitude)))
tableView.tableFooterView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: CGFloat.leastNormalMagnitude)))
FBente
la source
1
Gareautrain, merci d'avoir pris le temps de le mentionner ici :)
user2672052
13

Vous pouvez essayer ceci:

dans le loadView

_tableView.sectionHeaderHeight = 0;

ensuite

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

Il doit être supprimé tant que vous n'avez aucun objet dans l'en-tête ...

Et si vous voulez une certaine taille de l'en-tête de section, ne modifiez que la valeur de retour.

même si vous ne supprimez pas le sectionfooter.

_tableView.sectionFooterHeight = 0;

et

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

Eh bien, cela fonctionne pour mes problèmes avec la tableview dans iOS7.

Odd-Arne Dahle
la source
3

Vous devez supprimer le code self.tableView.tableHeaderView = [UIView new];après avoir ajouté

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return CGFLOAT_MIN;
}
Chris Yim
la source
C'est la footerhauteur qui pose problème dans mon cas. Merci pour l'aide.
pkc456
2

vous pouvez utiliser viewForHeaderInSectionet renvoyer une vue de n'importe quelle hauteur.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{

    int height = 30 //you can change the height 
    if(section==0)
    {
       UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, height)];

       return view;
    }
}
Divyam shukla
la source
Je ne demande pas les en-têtes de section, mais l'en-tête du tableau.
circuitlego
alors vous pouvez passer directement A uiview à la vue d'en-tête de table.
Divyam shukla
2

Dans Swift 2.0

func tableView(tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {

        return yourHeight
    }
George Asda
la source
2

Dans Swift 4

Supprimez le rembourrage supérieur supplémentaire dans la vue de table groupée.

Ici, la hauteur est donnée à 1 comme hauteur minimale pour l'en-tête de la section car vous ne pouvez pas donner 0 car tableview prendra la marge supérieure par défaut si une hauteur nulle est attribuée.

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

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    return UIView()
}
jaiswal Rajan
la source
0

Exemple de viewForHeaderInSection:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 118)];
view.backgroundColor = COLOR_DEFAULT;

NSString* key = [self.tableKeys objectAtIndex:section];
NSArray *result = (NSArray*)[self.filteredTableData objectForKey:key];
SZTicketsResult *ticketResult = [result objectAtIndex:0];

UIView *smallColoredView = [[UIView alloc] initWithFrame:CGRectMake(0, 5, 320, 3)];
smallColoredView.backgroundColor = COLOR_DEFAULT_KOSTKY;
[view addSubview:smallColoredView];

UIView *topBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 8, 320, 40)];
topBackgroundView.backgroundColor = [UIColor colorWithRed:255.0/255.0 green:248.0/255.0 blue:174.0/255.0 alpha:1];
[view addSubview:topBackgroundView];

UILabel *totalWinnings = [[UILabel alloc] initWithFrame:CGRectMake(10, 8, 300, 40)];
totalWinnings.text = ticketResult.message;
totalWinnings.minimumFontSize = 10.0f;
totalWinnings.numberOfLines = 0;
totalWinnings.backgroundColor = [UIColor clearColor];
totalWinnings.font = [UIFont boldSystemFontOfSize:15.0f];
[view addSubview:totalWinnings];

UIView *bottomBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 55, 320, 58)];
bottomBackgroundView.backgroundColor = [UIColor colorWithRed:255.0/255.0 green:248.0/255.0 blue:174.0/255.0 alpha:1];
[view addSubview:bottomBackgroundView];

UILabel *numberOfDraw = [[UILabel alloc] initWithFrame:CGRectMake(10, 55, 290, 58)];
numberOfDraw.text = [NSString stringWithFormat:@"sometext %@",[ticketResult.title lowercaseString]];;
numberOfDraw.minimumFontSize = 10.0f;
numberOfDraw.numberOfLines = 0;
numberOfDraw.backgroundColor = [UIColor clearColor];
numberOfDraw.font = [UIFont boldSystemFontOfSize:15.0f];
[view addSubview:numberOfDraw];

return view;
Jaspe
la source