web-dev-qa-db-fra.com

Comment centrer les en-têtes de section d'un UITableView

Je veux centrer l'en-tête sur la table, mais j'ai deux problèmes. Premièrement, je n'ai pas la bonne hauteur et deuxièmement, UILabel ne ressemble pas à l'en-tête par défaut - police/taille de police/couleur, etc. cela ressemble à l'en-tête par défaut.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger) section
{
    //section text as a label
    UILabel *lbl = [[UILabel alloc] init];
    lbl.textAlignment = UITextAlignmentCenter;  

    lbl.text = @"Header";
    [lbl setBackgroundColor:[UIColor clearColor]];  

    return lbl;
}
32
user317033

Vous devez également implémenter tableView: heightForHeaderInSection pour ajuster la hauteur de votre en-tête:

Dans la documentation UITableViewDelegate Protocol Reference, vous trouvez:

tableView: viewForHeaderInSection:

Discussion

L'objet retourné, par exemple, peut être un objet UILabel ou UIImageView . La vue tableau s'ajuste automatiquement la hauteur de l'en-tête de section à accueillir la vue retournée . Cette méthode ne fonctionne correctement que lorsque tableView: heightForHeaderInSection: est également mis en œuvre.

Pour centrer l'étiquette d'en-tête, vous devez spécifier le cadre de l'étiquette avant de définir son alignement sur center . Pour obtenir la police standard, utilisez SystemFontOfSize:

Méfiez-vous également vous créez une fuite de mémoire vous êtes censé renvoyer une vue autoreleased

Essayez quelque chose comme ça: 

UILabel *lbl = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 30)] autorelease];
lbl.textAlignment = UITextAlignmentCenter;
lbl.font = [UIFont systemFontOfSize:12];

J'espère que ça aide, Vincent

25
vdaubry

cela devrait résoudre votre problème. Testé en xcode 6/ios8

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    [[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setTextAlignment:NSTextAlignmentCenter];
    return [sectionTitles objectAtIndex:section];
}
26
Brackston Mayhall

Si vous ciblez iOS6 et versions ultérieures vous n'avez pas à fournir votre propre vue d'en-tête si vous souhaitez simplement centrer le titre de l'en-tête.

Il suffit de mettre en œuvre 

- tableView: willDisplayHeaderView: forSection:

et définissez la propriété textAligment de l'étiquette:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    if([view isKindOfClass:[UITableViewHeaderFooterView class]]){

        UITableViewHeaderFooterView *tableViewHeaderFooterView = (UITableViewHeaderFooterView *) view;
        tableViewHeaderFooterView.textLabel.textAlignment = NSTextAlignmentCenter;
    }
}
19
Volker Voecking

La réponse de Volker dans Swift:

Si vous ciblez iOS6 et les versions ultérieures, vous n'avez pas à fournir votre propre vue d'en-tête si vous souhaitez simplement centrer le titre de l'en-tête.

Il suffit de mettre en œuvre

- tableView:willDisplayHeaderView:forSection:

et définissez la propriété textAligment de l'étiquette:

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.textLabel?.textAlignment = .Center
    }
}
12
Tal Haham

Pour que cette méthode soit appelée, vous devez d’abord implémenter

titleForHeaderInSection

alors la méthode tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) sera appelée

Swift Solution:

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {


        headerView.textLabel?.textAlignment = Localize().isRTL ? .Right : .Left
        headerView.textLabel?.text = partsDataSource[section]
        headerView.textLabel?.textColor = UIColor ( red: 0.0902, green: 0.2745, blue: 0.2745, alpha: 1.0 )
        headerView.textLabel?.font = UIFont(name: UIDecorator.sharedInstance.PRIMARY_FONT, size: 14.0)
        headerView.contentView.backgroundColor = UIDecorator.sharedInstance.currentTheme.lightShadeColor
    }
}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return " "
}
5
Abo3atef

Voici ma version, vous aurez besoin de prendre une capture d'écran de l'arrière-plan normal de l'en-tête, puis d'enregistrer une tranche de 1px de large sous le nom 'my_head_bg.png' et de l'ajouter au projet. De cette façon, ça aura l'air exactement normal:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UILabel *lbl = [[[UILabel alloc] init] autorelease];
    lbl.textAlignment = UITextAlignmentCenter;
    lbl.font = [UIFont fontWithName:@"Helvetica-Bold" size:18];
    lbl.text = @"My Centered Header";
    lbl.textColor = [UIColor whiteColor];
    lbl.shadowColor = [UIColor grayColor];
    lbl.shadowOffset = CGSizeMake(0,1);
    lbl.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"my_head_bg"]];
    lbl.alpha = 0.9;
    return lbl;
}
5
Chris

Essaye ça

    UILabel *tableHeader = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)];
[tableHeader setText:@"This is header"];
[tableHeader setTextAlignment:UITextAlignmentCenter];

UITableView *newTable = [[UITableView alloc] initWithFrame:CGRectMake(20, 0, 280, 200) style:UITableViewStylePlain];
[newTable setBackgroundColor:[UIColor clearColor]];
[newTable setTableHeaderView:tableHeader];
self.view = newTable;
1
Prabh

En Xamarin:

        // Center Header
        public override void WillDisplayHeaderView(UITableView tableView, UIView headerView, nint section)
        {
            if (headerView.GetType() == typeof(UITableViewHeaderFooterView))
            {
                UITableViewHeaderFooterView tableViewHeaderFooterView = (UITableViewHeaderFooterView)headerView;
                tableViewHeaderFooterView.TextLabel.TextAlignment = UITextAlignment.Center;
            }
        }
0