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

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

EDIT : la réponse fournie par DJ-s doit être prise en compte pour iOS 6 et supérieur. La réponse acceptée est obsolète.

291
demandé sur Community 2009-05-02 00:14:36

28 réponses

Espérons que cette méthode du protocole UITableViewDelegate vous aidera à démarrer:

Objectif-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
}

mise à Jour 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
    }

Remplacez [UIColor redColor] par le UIColor que vous souhaitez. Vous pouvez également ajuster les dimensions de headerView.

369
répondu Alex Reynolds 2017-08-29 06:12:31

C'est 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 iOS 6 et plus, vous pouvez facilement changer la couleur d'arrière-plan et la couleur du texte en définissant le

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

Méthode de délégué 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

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){
    view.tintColor = UIColor.red
    let header = view as! UITableViewHeaderFooterView
    header.textLabel?.textColor = UIColor.white
}
653
répondu Dj S 2017-01-03 15:03:16

Voici comment changer 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];
96
répondu DoctorG 2015-09-20 06:25:23

Vous pouvez le faire si vous voulez en-tête avec une couleur personnalisée:

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

Cette solution fonctionne très bien depuis iOS 6.0.

49
répondu Leszek Zarna 2013-09-04 10:01:38

La solution suivante fonctionne pour Swift 1.2 avec iOS 8+

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    // This changes the header background
    view.tintColor = UIColor.blueColor()

    // Gets the header view as a UITableViewHeaderFooterView and changes the text colour
    var headerView: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    headerView.textLabel.textColor = UIColor.redColor()

}
30
répondu Max 2015-06-20 08:03:29

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

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 30;
}
21
répondu whyoz 2012-01-16 17:47:17

Si vous ne voulez pas créer une vue personnalisée, vous pouvez également changer la couleur comme ceci (nécessite iOS 6):

-(void) tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    if ([view isKindOfClass: [UITableViewHeaderFooterView class]]) {
        UITableViewHeaderFooterView* castView = (UITableViewHeaderFooterView*) view;
        UIView* content = castView.contentView;
        UIColor* color = [UIColor colorWithWhite:0.85 alpha:1.]; // substitute your color here
        content.backgroundColor = color;
    }
}
18
répondu William Jockusch 2013-10-03 14:43:57

La définition de la couleur d'arrière-plan sur UITableViewHeaderFooterView a été obsolète. Veuillez utiliser contentView.backgroundColor à la place.

16
répondu Alex 2013-03-01 21:17:00

Définissez l'arrière-plan et la couleur du texte de la zone de section: (grâce à William Jockusch et Dj S)

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    if ([view isKindOfClass: [UITableViewHeaderFooterView class]]) {
        UITableViewHeaderFooterView* castView = (UITableViewHeaderFooterView*) view;
        castView.contentView.backgroundColor = [UIColor grayColor];
        [castView.textLabel setTextColor:[UIColor grayColor]];
    }
}
13
répondu Roozbeh Zabihollahi 2014-04-13 20:15:26

Vous pouvez le faire sur main.storyboard dans environ 2 secondes.

  1. Sélectionner La Vue De La Table
  2. aller à L'Inspecteur des attributs
  3. Élément de liste
  4. Faites défiler vers le bas pour afficher le sous-titre
  5. Modifier "arrière-plan"

Jetez un oeil ici

13
répondu Steve 2016-02-03 11:17:13

Voici comment ajouter une image dans la vue d'en-tête:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{
    UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];
    UIImageView *headerImage = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-gery-bar.png"]] autorelease];

    headerImage.frame = CGRectMake(0, 0, tableView.bounds.size.width, 30);

    [headerView addSubview:headerImage];

    return headerView;
}
10
répondu Maulik 2013-10-03 05:37:37

Pour iOS8 (bêta) et Swift choisissez la couleur RVB que vous voulez et essayez ceci:

override func tableView(tableView: UITableView!, viewForHeaderInSection section: Int) -> UIView! {
    var header :UITableViewHeaderFooterView = UITableViewHeaderFooterView()

    header.contentView.backgroundColor = UIColor(red: 254.0/255.0, green: 190.0/255.0, blue: 127.0/255.0, alpha: 1)
    return header

}

(Le" override " est là puisque j'utilise le UITableViewController au lieu d'un UIViewController normal dans mon projet, mais ce n'est pas obligatoire pour changer la couleur de l'en-tête de section)

Le texte de votre en-tête sera toujours visible. Notez que vous devrez ajuster la hauteur de l'en-tête de section.

Bonne Chance.

8
répondu Corona 2014-08-22 11:00:24

SWIFT 2

J'ai réussi à changer la couleur d'arrière-plan de la section avec un effet de flou ajouté (ce qui est vraiment cool). Pour changer facilement la couleur d'arrière-plan de la section:

  1. allez D'abord dans Storyboard et sélectionnez la vue de la Table
  2. aller à L'Inspecteur des attributs
  3. élément de liste
  4. Faites défiler vers le bas pour afficher
  5. Modifier "Arrière-Plan"

Ensuite, pour l'effet de flou, ajoutez au code:

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    // This is the blur effect

    let blurEffect = UIBlurEffect(style: .Light)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)

    // Gets the header view as a UITableViewHeaderFooterView and changes the text colour and adds above blur effect
    let headerView: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    headerView.textLabel!.textColor = UIColor.darkGrayColor()
    headerView.textLabel!.font = UIFont(name: "HelveticaNeue-Light", size: 13)
    headerView.tintColor = .groupTableViewBackgroundColor()
    headerView.backgroundView = blurEffectView

}
6
répondu A.J. Hernandez 2016-07-28 17:55:18

Je sais que c'est répondu, juste au cas où, dans Swift, utilisez ce qui suit

    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let tableViewWidth = self.tableView.bounds

        let headerView = UIView(frame: CGRectMake(0, 0, tableViewWidth.size.width, self.tableView.sectionHeaderHeight))
        headerView.backgroundColor = UIColor.greenColor()

        return headerView
    }
5
répondu arango_86 2015-10-02 07:45:58

Swift 4

Pour changer la couleur d'arrière-plan , Text label color et font pour la vue D'en-tête D'une Section UITableView, remplacez simplement willDisplayHeaderView pour votre vue de table comme ceci:

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        let header = view as! UITableViewHeaderFooterView
        header.backgroundView?.backgroundColor = .white
        header.textLabel?.textColor = .black
        header.textLabel?.font = UIFont(name: "Helvetica-Bold", size: 14)
} 

Cela a parfaitement fonctionné pour moi; j'espère que cela vous aidera aussi!

5
répondu Nii Mantse 2018-05-29 10:47:36

IOS 8+

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        tableView.tableHeaderView?.backgroundColor = UIColor.blue()
}
4
répondu Gentian Sadiku 2016-09-02 12:10:55

Basé sur la réponse de @Dj, en utilisant Swift 3. Cela fonctionne très bien sur iOS 10.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    // Background color
    view.tintColor = UIColor.black

    // Text Color
    let headerView = view as! UITableViewHeaderFooterView
    headerView.textLabel?.textColor = UIColor.white
}
4
répondu tesla 2016-11-03 16:41:07

J'ai un projet utilisant des cellules de vue de table statiques, dans iOS 7.X. willDisplayHeaderView ne se déclenche pas. Cependant, cette méthode fonctionne bien:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    NSLog(@"%s", __FUNCTION__);
    CGRect headerFrame = CGRectMake(x, y, w, h);    
    UIView *headerView = [[UIView alloc] initWithFrame:headerFrame];  
    headerView.backgroundColor = [UIColor blackColor];
3
répondu David DelMonte 2014-01-24 01:40:38
 -(void) tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view
  forSection:(NSInteger)section
  {
        if ([view isKindOfClass: [UITableViewHeaderFooterView class]])
        {
             UITableViewHeaderFooterView *castView = (UITableViewHeaderFooterView *) view;
             UIView *content = castView.contentView;
             UIColor *color = [UIColor whiteColor]; // substitute your color here
             content.backgroundColor = color;
             [castView.textLabel setTextColor:[UIColor blackColor]];
        }
 }
3
répondu Vinoth 2014-02-06 09:28:45

Je pense que ce code n'est pas si mauvais.

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tableView.dequeueReusableHeaderFooterViewWithIdentifier(MyHeaderView.reuseIdentifier) as MyHeaderView
    let backgroundView = UIView()
    backgroundView.backgroundColor = UIColor.whiteColor()
    headerView.backgroundView = backgroundView
    headerView.textLabel.text = "hello"
    return headerView
}
3
répondu mmtootmm 2015-02-03 09:39:27

Dans iOS 7.0.4, j'ai créé un en-tête personnalisé avec son propre XIB. Rien mentionné ici avant travaillé. Ce devait être la sous-classe de UITableViewHeaderFooterView pour travailler avec le dequeueReusableHeaderFooterViewWithIdentifier: et il semble que la classe soit très têtue en ce qui concerne la couleur d'arrière-plan. Donc, finalement, j'ai ajouté un UIView (vous pouvez le faire soit avec du code ou IB) avec le nom customBackgroudView, puis définissez sa propriété backgroundColor. Dans layoutSubviews: j'ai défini le cadre de cette vue sur les limites. Il fonctionne avec iOS 7 et ne donne pas pépin.

// in MyTableHeaderView.xib drop an UIView at top of the first child of the owner
// first child becomes contentView

// in MyTableHeaderView.h
@property (nonatomic, weak) IBOutlet UIView * customBackgroundView;

// in MyTableHeaderView.m
-(void)layoutSubviews;
{
    [super layoutSubviews];

    self.customBackgroundView.frame = self.bounds;
}
// if you don't have XIB / use IB, put in the initializer:
-(id)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
    ...
    UIView * customBackgroundView = [[UIView alloc] init];
    [self.contentView addSubview:customBackgroundView];
    _customBackgroundView = customBackgroundView;
    ...
}


// in MyTableViewController.m
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    MyTableHeaderView * header = [self.tableView
                                          dequeueReusableHeaderFooterViewWithIdentifier:@"MyTableHeaderView"];
    header.customBackgroundView.backgroundColor = [UIColor redColor];
    return header;
}
2
répondu Maksymilian Wojakowski 2014-02-15 21:59:13

Il suffit de changer la couleur du calque de la vue d'en-tête

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{
  UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0,    tableView.bounds.size.width, 30)] autorelease];
 headerView.layer.backgroundColor = [UIColor clearColor].CGColor
}

2
répondu Ramesh 2016-04-13 07:18:00

Si quelqu'un a besoin de swift, conserve le titre:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView(frame: CGRect(x: 0,y: 0,width: self.tableView.frame.width, height: 30))
    view.backgroundColor = UIColor.redColor()
    let label = UILabel(frame: CGRect(x: 15,y: 5,width: 200,height: 25))
    label.text = self.tableView(tableView, titleForHeaderInSection: section)
    view.addSubview(label)
    return view
}
2
répondu Cmar 2016-07-28 21:30:14

Dans mon cas, cela a fonctionné comme ceci:

let headerIdentifier = "HeaderIdentifier"
let header = self.tableView.dequeueReusableHeaderFooterView(withIdentifier: headerIdentifier)
header.contentView.backgroundColor = UIColor.white
2
répondu Idrees Ashraf 2017-11-09 09:23:53

Avec RubyMotion / RedPotion, collez ceci dans votre écran de Table:

  def tableView(_, willDisplayHeaderView: view, forSection: section)
    view.textLabel.textColor = rmq.color.your_text_color
    view.contentView.backgroundColor = rmq.color.your_background_color
  end

Fonctionne comme un charme!

1
répondu Eli Duke 2016-02-17 21:23:54

J'ai reçu un message de Xcode via le journal de la console

[TableView] réglage de la couleur d'arrière-plan sur UITableViewHeaderFooterView a été obsolète. Veuillez personnaliser UIView avec la couleur d'arrière-plan souhaitée dans backgroundView la propriété à la place.

Ensuite, je crée juste un nouveau UIView et le pose en arrière-plan de HeaderView. Pas une bonne solution mais c'est facile comme dit Xcode.

1
répondu Pokotuz 2017-10-04 09:10:35

Bien que func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) fonctionne également, vous pouvez réaliser cela sans implémenter une autre méthode de délégué. dans votre méthode func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?, vous pouvez utiliser view.contentView.backgroundColor = UIColor.white au lieu de view.backgroundView?.backgroundColor = UIColor.white qui ne fonctionne pas. (Je sais que backgroundView est facultatif, mais même quand il est là, ce n'est pas woking sans implémenter willDisplayHeaderView

0
répondu gutte 2018-01-16 12:46:21

En utilisant UIAppearance, vous pouvez le changer pour tous les en-têtes de votre application comme ceci:

UITableViewHeaderFooterView.apparence().backgroundColor = thème.subViewBackgroundColor

0
répondu user2704776 2018-01-26 19:08:03