web-dev-qa-db-fra.com

UITableViewHeaderFooterView: impossible de changer la couleur d'arrière-plan

J'essaie de changer la couleur d'arrière-plan de UITableViewHeaderFooterView. Bien que la vue apparaisse, la couleur d'arrière-plan reste la couleur par défaut. Je reçois un journal de xcode disant:

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

Cependant, aucune des options suivantes ne fonctionne:

myTableViewHeaderFooterView.contentView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundColor = [UIColor blackColor];

J'ai également essayé de changer la couleur d'arrière-plan de la vue dans le fichier xib. 

Aucune suggestion? Merci.

97
Chun

Vous devez utiliser myTableViewHeaderFooterView.tintColor ou attribuer une vue d'arrière-plan personnalisée à myTableViewHeaderFooterView.backgroundView.

72
Matt

iOS 8, 9, 10, 11 ...

La seule façon de définir une couleur (avec n'importe quel alpha) est d'utiliser backgroundView:

Rapide

self.backgroundView = UIView(frame: self.bounds)
self.backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)

Obj-C

self.backgroundView = ({
    UIView * view = [[UIView alloc] initWithFrame:self.bounds];
    view.backgroundColor = [UIColor colorWithWhite: 0.5 alpha:0.5];
    view;
    });

Réponses aux commentaires 

  • Aucune de ces autres options ne fonctionne de manière fiable (malgré les commentaires ci-dessous)} _

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
    
  • la backgroundView est redimensionnée automatiquement. (Inutile d'ajouter des contraintes)

  • Alpha de contrôle avec UIColor(white: 0.5, alpha: 0.5) ou backgroundView.alpha = 0.5.
    (bien sûr, n'importe quelle couleur conviendra)}

  • Lorsque vous utilisez XIB, définissez la vue racine sur UITableViewHeaderFooterView et associez la backgroundView par programme:

    Inscrivez-vous avec:

    tableView.register(UINib(nibName: "View", bundle: nil),
                       forHeaderFooterViewReuseIdentifier: "header")
    

    Charger avec:

    override func tableView(_ tableView: UITableView,
                            viewForHeaderInSection section: Int) -> UIView? {
        if let header =
            tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") {
            let backgroundView = UIView(frame: header.bounds)
            backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
            header.backgroundView = backgroundView
            return header
        }
        return nil
    }
    

 Demo

↻ Replay animation

► Trouvez cette solution sur GitHub et des détails supplémentaires sur Swift Recipes .

161
SwiftArchitect

Dans iOS 7, contentView.backgroundColor fonctionnait pour moi, tintColor ne le faisait pas.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Bien que clearColor ne fonctionne pas pour moi, la solution que j'ai trouvée consiste à définir la propriété backgroundView sur image transparente. Peut-être que cela aidera quelqu'un:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), NO, 0.0);
UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];
17
sash

Assurez-vous de définir la couleur d'arrière-plan de la contentView pour votre UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Alors ça va marcher.

11
Rudolf J

Pour moi, j’ai essayé tout ce qui est dit ci-dessus, mais je recevais toujours l’avertissement "La définition de la couleur de fond sur UITableViewHeaderFooterView est obsolète. Veuillez utiliser contentView.backgroundColor à la place." puis j'ai essayé ceci: dans le fichier xib, la couleur d'arrière-plan de la vue en-tête était sélectionnée pour effacer la couleur au lieu de la valeur par défaut une fois que je l'avais modifiée par défaut, l'avertissement avait disparu.  was this

 Changed to this

9
AmJa

Pour une couleur claire, j'utilise

self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundView = [UIView new];
self.backgroundView.backgroundColor = [UIColor clearColor];

Cela me semble bien.

5
ChildhoodAndy

 enter image description here Dans le générateur d'interface, affichez votre .xib, dans l'élément supérieur, dans l'inspecteur d'attributs, définissez la couleur d'arrière-plan sur la valeur par défaut. Ensuite, accédez à la vue Contenu et définissez la couleur d'arrière-plan (référence à https://github.com/jiecao-fm/SwiftTheme/issues/24 ).

4
Hosny

si vous avez créé une sous-classe personnalisée de UITableViewHeaderFooterView avec le fichier xib, vous devez remplacer setBackgroundColor. Gardez le vide. 

-(void)setBackgroundColor:(UIColor *)backgroundColor {

}

Et cela résoudra votre problème.

4
Voloda2

Sur iOS9 headerView.backgroundView.backgroundColor a fonctionné pour moi:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    TableViewHeader *headerView = (TableViewHeader *)[super tableView:tableView viewForHeaderInSection:section];
    headerView.backgroundView.backgroundColor = [UIColor redColor];
}

Sur iOS8 J'utilisais headerView.contentView.backgroundColor sans problème, mais maintenant avec iOS 9, je rencontrais un problème étrange qui faisait que la couleur d'arrière-plan ne remplissait pas tout l'espace de la cellule. J'ai donc juste essayé headerView.backgroundColor et j'ai eu la même erreur de l'OP. 

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

Alors maintenant tout fonctionne bien et sans avertissement en utilisant headerView.backgroundView.backgroundColor

4
Jan

Si vous êtes personnalisation d'une cellule d'en-tête de section avec Storyboard/Nib }, assurez-vous que la couleur d'arrière-plan est default pour la vue "En-tête de section de tableau".

Et si vous sous-classe UITableViewHeaderFooterView et utilisez nib, vous devez alors créer un IBOutlet pour la vue de contenu et le nommer, par exemple. containerView. Ceci ne doit pas être confondu avec contentView, qui est le parent de cette vue conteneur.

Avec cette configuration, vous modifiez plutôt la couleur d'arrière-plan de containerView.

4
samwize

Pour les couleurs d’arrière-plan uni, définir le contentView.backgroundColor devrait suffire:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .red // Works!
    }
}

Pour les couleurs avec transparence, y compris la couleur .clear, cela ne fonctionne plus:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .clear // Does not work ????
    }
}

Pour un en-tête de section totalement transparent, définissez la propriété backgroundView sur une vue vide:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.backgroundView = UIView() // Works!
    }
}

Cependant, méfiez-vous des effets secondaires possibles. À moins que la vue du tableau ne soit définie sur "Groupé", les en-têtes de section s'emboîtent en haut lors du défilement. Si les en-têtes de section sont transparents, le contenu de la cellule sera visible, ce qui pourrait ne pas être très beau.

Ici, les en-têtes de section ont un fond transparent:

 enter image description here

Pour éviter cela, il est préférable de définir l'arrière-plan de l'en-tête de section sur une couleur unie (ou un dégradé) correspondant à l'arrière-plan de votre vue tableau ou de votre contrôleur de vue.

Ici, les en-têtes de section ont un fond dégradé totalement opaque:

 enter image description here

3
Eneko Alonso

J'ai essayé avec la chaîne AspectWhenContainedIn et cela a fonctionné pour moi.

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil] 
         setBackgroundColor: [UIColor.grayColor]];
1
tylyo

Rapide:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
    var headerView: TableViewHeader = super.tableView(tableView, viewForHeaderInSection: section) as! TableViewHeader
    headerView.backgroundView.backgroundColor = UIColor.redColor()
}
0
A.G

Je me sens obligé de partager mon expérience. J'avais ce morceau de code qui fonctionnait bien avec iOS 10 et iOS 11 headerView?.contentView.backgroundColor = .lightGray 

Puis tout à coup, j'ai décidé de déployer l'application pour iOS 9, car il existe certains appareils (iPad mini, une génération plus ancienne ne met à jour aucun système d'exploitation au-delà de 9) - La seule solution qui fonctionnait pour tous les iOS 9, 10 et 11 était de définir une vue de base pour l'en-tête qui contenait ensuite toutes les autres sous-vues de l'en-tête, de la relier à partir du storyboard et de définir la variable backgroundColor de cette vue de base.

Lors du câblage de la prise, gardez à l'esprit de ne pas l'appeler: backgroundView car il existe déjà une propriété portant ce nom dans une superclass. J'ai appelé le mien containingView

De même, lors du câblage du contrôle de la prise, cliquez sur la vue dans Document Outline pour vous assurer qu'elle n'est pas câblée jusqu'à file owner.

0
Ahmed Khedr

Créez UIView et définissez la couleur d'arrière-plan, puis définissez-le sur self.backgroundView.

- (void)setupBackgroundColor:(UIColor *) color {
    UIView *bgView = [[UIView alloc] initWithFrame:self.bounds];
    bgView.backgroundColor = color;
    self.backgroundView = bgView;
}
0
Mike Kupriyanov

La définition de BackgroundView avec une couleur claire fonctionne correctement pour les en-têtes visibles . Si le tableau défile pour afficher les en-têtes en bas, cette solution échoue.

La table P.S.My consiste uniquement en en-têtes sans aucune cellule. 

0
user3106871

peut-être parce que le backgroundView n'existe pas

override func draw(_ rect: CGRect){
    // Drawing code
    let view = UIView()
    view.frame = rect
    self.backgroundView = view
    self.backgroundView?.backgroundColor = UIColor.yourColorHere
}

ça marche pour moi.

0
kidnapper