346 votes

UITableView - changer la couleur de l'en-tête de section

Comment puis-je changer la couleur de l'en-tête d'une section dans UITableView ?

EDIT : Le site réponse fournie par DJ-S doit être envisagé pour iOS 6 et plus. La réponse acceptée n'est plus d'actualité.

4 votes

J'apprécie vraiment l'édition RE des nouvelles versions iOS.

770voto

Dj S Points 1946

Il s'agit d'une vieille question, mais je pense que la réponse doit être mise à jour.

Cette méthode n'implique pas de définir et de créer votre propre vue personnalisée. Dans les versions iOS 6 et ultérieures, vous pouvez facilement modifier la couleur de l'arrière-plan et du texte en définissant l'attribut

-(void)tableView:(UITableView *)tableView 
    willDisplayHeaderView:(UIView *)view 
    forSection:(NSInteger)section

méthode de délégation de section

Par exemple :

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    // Background color
    view.tintColor = [UIColor blackColor];

    // Text Color
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
    [header.textLabel setTextColor:[UIColor whiteColor]];

    // Another way to set the background color
    // Note: does not preserve gradient effect of original header
    // header.contentView.backgroundColor = [UIColor blackColor];
}

Tiré de mon post ici : https://happyteamlabs.com/blog/ios-how-to-customize-table-view-header-and-footer-colors/

Swift 3 / 4

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){
    view.tintColor = UIColor.red
    let header = view as! UITableViewHeaderFooterView
    header.textLabel?.textColor = UIColor.white
}

4 votes

Je ne savais même pas que cela avait été ajouté au SDK. C'est génial ! Absolument la bonne réponse.

1 votes

OP - Veuillez mettre à jour la réponse acceptée à celle-ci. Beaucoup plus propre que les anciennes approches.

10 votes

Ça n'a pas l'air de fonctionner pour moi. La couleur du texte fonctionne mais pas la teinte de l'arrière-plan de l'en-tête. Je suis sous iOS 7.0.4.

398voto

Alex Reynolds Points 45039

Espérons que cette méthode de l UITableViewDelegate vous permettra de commencer :

Objective-C :

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{
  UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];
  if (section == integerRepresentingYourSectionOfInterest)
     [headerView setBackgroundColor:[UIColor redColor]];
  else 
     [headerView setBackgroundColor:[UIColor clearColor]];
  return headerView;
}

Swift :

func tableView(_ tableView: UITableView!, viewForHeaderInSection section: Int) -> UIView!
{
  let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: 30))
  if (section == integerRepresentingYourSectionOfInterest) {
    headerView.backgroundColor = UIColor.redColor()
  } else {
    headerView.backgroundColor = UIColor.clearColor()
  }
  return headerView
}

Mis à jour en 2017 :

Swift 3 :

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
    {
        let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: 30))
        if (section == integerRepresentingYourSectionOfInterest) {
            headerView.backgroundColor = UIColor.red
        } else {
            headerView.backgroundColor = UIColor.clear
        }
        return headerView
    }

Remplacer [UIColor redColor] avec n'importe quelle UIColor vous aimeriez. Vous pouvez également ajuster les dimensions de headerView .

17 votes

Il peut également être utile d'ajuster la taille de l'en-tête de la section en utilisant self.tableView.sectionHeaderHeight. Sinon, vous risquez d'avoir du mal à voir le texte que vous affichez pour le titre de la section.

0 votes

Fonctionne bien avec [UIColor xxxColor] Cependant, lorsque j'essaie d'obtenir une couleur personnalisée, comme celles que je peux obtenir dans Photoshop (donc en utilisant l'option UIColor red:green:blue:alpha: il est juste blanc. Est-ce que je fais quelque chose de mal ?

0 votes

Postez une question distincte et nous essaierons de vous aider. Inclure le code source.

98voto

DoctorG Points 1061

Voici comment modifier la couleur du texte.

UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(10, 3, tableView.bounds.size.width - 10, 18)] autorelease];
label.text = @"Section Header Text Here";
label.textColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.75];
label.backgroundColor = [UIColor clearColor];
[headerView addSubview:label];

18 votes

Merci DocteurG - C'était utile. BTW - pour conserver l'étiquette existante fournie par le dataSource, j'ai modifié la 2ème ligne comme suit : label.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:section] ; C'est peut-être mal vu, mais ça a marché pour moi. Peut-être que cela peut aider quelqu'un d'autre.

1 votes

@JJ Cette forme est en fait correcte, puisque vous appelez la même méthode que celle que vous utiliseriez initialement pour définir l'en-tête de section du tableau.

3 votes

J'ai supprimé l'autorelease et l'ai remplacé par un release explicite. Les méthodes de formatage des UITableView sont appelées de très nombreuses fois. Évitez d'utiliser autorelease si possible.

59voto

Leszek Żarna Points 638

Vous pouvez le faire si vous voulez un en-tête avec une couleur personnalisée. Cette solution fonctionne parfaitement depuis iOS 6.0.

Objectif C :

[[UITableViewHeaderFooterView appearance] setTintColor:[UIColor redColor]];

Swift :

UITableViewHeaderFooterView.appearance().tintColor = .white

1 votes

Hm... cela ne fonctionne pas pour moi. J'ai essayé le simulateur iOS 6 et l'appareil iOS 7. Avez-vous testé de cette façon ? Où dois-je le placer ?

0 votes

Cela peut être fait dans la méthode application:didFinishLaunchingWithOptions : du délégué de l'application.

0 votes

Ma faute : j'ai essayé d'utiliser cette méthode avec UITableViewStyleGrouped BTW : pour changer la couleur du texte, il faut utiliser cette méthode. stackoverflow.com/a/20778406/751932

20voto

whyoz Points 1308

N'oubliez pas d'ajouter ce morceau de code à partir du délégué, sinon votre vue sera coupée ou apparaîtra derrière le tableau dans certains cas, par rapport à la hauteur de votre vue/étiquette.

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

0 votes

Cela n'est plus nécessaire si vous suivez la réponse de Dj S pour iOS6 et les versions ultérieures.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X