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

124

J'essaye 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 est 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.

Chun
la source
2
dans iOS 13, utilisez contentView.backgroundColor a fonctionné pour moi. Je pense qu'Apple a mis à jour ceci
Tà Truhoada

Réponses:

95

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

Mat
la source
2
myTableViewHeaderFooterView.tintColor fonctionne parfaitement. Merci d'avoir répondu!
Chun
15
Je ne sais pas pourquoi, mais pour moi, je tintColorne travaille pas sur iOS7. Je ne pourrais changer de couleur qu'en myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
attribuant une
7
TintColor n'est pas la couleur de fond !!
João Nunes
189

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];
  • le backgroundViewest redimensionné automatiquement. (Pas besoin d'ajouter des contraintes)

  • Contrôle alpha avec UIColor(white: 0.5, alpha: 0.5)ou backgroundView.alpha = 0.5.
    (bien sûr, n'importe quelle couleur fera l'affaire)

  • Lorsque vous utilisez XIB , faites de la vue racine UITableViewHeaderFooterViewet associez-la par backgroundViewprogramme:

    Inscrivez-vous avec:

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

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

Démo

↻ relire l'animation

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

SwiftArchitect
la source
5
contentView n'existe pas, c'est pourquoi. tintcolor consiste à teinter la vue et non son arrière-plan. et backgroundcolor est obsolète. Ainsi, votre chemin est le moyen de le faire fonctionner. Btw belle syntaxe de code
João Nunes
@ JoãoNunes, avec C # / Xamarin la syntaxe est encore plus view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
soignée
Dans Xcode 6.1.1, vous obtenez un avertissement de console d'exécution:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori
Avec Xcode6.2 beta5, j'ai toujours le même avertissement. Ma méthode de création de UITableViewHeaderFooterView est basée sur le chargement de xib qui est similaire à l'exemple de code Apple, TVAnimationsGestures. Cependant, TVAnimationGestures avec Xcode6.2b5 ne génère aucun message d'avertissement. Le code Apple n'a pas du tout de chaîne «d'arrière-plan». Bien sûr, uitableVuewHeaderFooterview.contentView est nul dans TVAnimationsGestures. Je ne comprends pas pourquoi cela arrive.
kmugitani
7
Pour les personnes qui reçoivent toujours l'avertissement: assurez-vous que UITableViewHeaderFooterView n'a pas de backgroundColor défini dans IB.
Tuslareb
24

Dans iOS 7 a contentView.backgroundColorfonctionné pour moi, tintColorn'a pas.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Bien que clearColorcela ne fonctionne pas pour moi, la solution que j'ai trouvée est de définir la backgroundViewpropriété sur l'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];
ceinture
la source
Je pense que c'est une meilleure approche que la réponse de @SwiftArchitect (même si cela a fonctionné). Le fait que vous n'ayez pas à ajouter un nouvel UIView le rend bien meilleur. A parfaitement fonctionné pour moi.
Erick A. Montañez
14

Assurez-vous de définir la couleur backgroundColor de contentViewpour votre UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Ensuite, cela fonctionnera.

Rudolf J
la source
iOS> = 10 uniquement !. Pour iOS <10, utilisez: backgroundView? .BackgroundColor = UIColor.white
Peter Kreinz
12

Pour moi, j'ai essayé tout ce qui est indiqué ci-dessus, mais je recevais toujours l'avertissement "La définition de la couleur d'arrière-plan 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 d'en-tête a été sélectionnée pour effacer la couleur au lieu de la valeur par défaut une fois que je l'ai changée par défaut, l'avertissement a disparu. était-ce

Changé à ceci

AmJa
la source
7

Pour une couleur claire, j'utilise

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

Cela me semble bien.

EnfanceAndy
la source
1
Réglage backgroundView = UIView()et backgroundColor = .clearétait alors la seule solution de travail. Je vous remercie.
Vive
7

Pour les couleurs d'arrière-plan unies, le réglage contentView.backgroundColordevrait 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 .clearcouleur, 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 entièrement transparent, définissez la backgroundViewpropriété 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'aligneront en haut lors du défilement vers le bas. Si les en-têtes de section sont transparents, le contenu de la cellule sera visible à travers, ce qui peut ne pas avoir l'air parfait.

Ici, les en-têtes de section ont un arrière-plan transparent:

entrez la description de l'image ici

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 de tableau ou de votre contrôleur de vue.

Ici, les en-têtes de section ont un arrière-plan dégradé entièrement opaque:

entrez la description de l'image ici

Eneko Alonso
la source
Génie! La définition d'un UIView vide pour backgroundView a totalement résolu le problème pour moi! Merci!
Luiz Dias le
6

entrez la description de l'image iciDans le générateur d'interface, tirez votre .xib, sur l'élément supérieur, dans l'inspecteur d'attributs, définissez la couleur d'arrière-plan par défaut. Ensuite, allez dans la vue de contenu et définissez la couleur d'arrière-plan (référence à https://github.com/jiecao-fm/SwiftTheme/issues/24 ).

Hosny
la source
4

Sur iOS9 a headerView.backgroundView.backgroundColor 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.backgroundColorsans problème, mais maintenant avec iOS 9, j'obtenais un problème étrange qui empêchait la couleur d'arrière-plan de remplir tout l'espace de la cellule. J'ai donc essayé juste headerView.backgroundColoret j'ai eu la même erreur de l'OP.

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

Alors maintenant, tout fonctionne très bien et sans avertissement en utilisant headerView.backgroundView.backgroundColor

Jan
la source
4

si vous avez créé une sous-classe personnalisée de UITableViewHeaderFooterViewwith xibfile, vous devez remplacer setBackgroundColor. Gardez-le vide.

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

}

Et cela résoudra votre problème.

Voloda2
la source
C'est la bonne réponse pour moi. Bien que je ne définisse aucune couleur d'arrière-plan dans mon HeaderFooterView, mais le message d'avertissement continue de s'afficher dans le journal de ma console. Si ennuyant!
stan liu
4

Si vous personnalisez une cellule d'en-tête de section avec Storyboard / Nib , assurez-vous que la couleur d'arrière-plan est par défaut pour la vue «En-tête de section de tableau».

Et si vous sous UITableViewHeaderFooterView- classez , et en utilisant nib, alors ce que vous devez faire est de créer un IBOutletpour la vue de contenu, et de le nommer par exemple. containerView. Il ne faut pas confondre cela avec contentView, qui est le parent de cette vue de conteneur.

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

samwize
la source
1

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

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

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
}

cela fonctionne pour moi.

andrew54068
la source
1

iOS 12, Swift 5. Si vous souhaitez (ou essayez!) d'utiliser un proxy d'apparence, la solution suivante fonctionne:

  1. Sous-classe UITableViewHeaderFooterView et exposez votre propre paramètre de proxy d'apparence.
final class MySectionHeaderView: UITableViewHeaderFooterView {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
    }

    @objc dynamic var forceBackgroundColor: UIColor? {
        get { return self.contentView.backgroundColor }
        set(color) {
            self.contentView.backgroundColor = color
            // if your color is not opaque, adjust backgroundView as well
            self.backgroundView?.backgroundColor = .clear
        }
    }
}
  1. Définissez le proxy d'apparence avec la granularité souhaitée.
MySectionHeaderView.appearance().forceBackgroundColor = .red

ou

MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red
Eli Burke
la source
1

Oubliez les difficultés.

Ajoutez à votre projet UITableViewHeaderFooterView+BGUpdate.swiftavec le code ci-dessous:

extension UITableViewHeaderFooterView {

    open override var backgroundColor: UIColor? {
        get {
            return self.backgroundColor
        }
        set {
            let bgView = UIView()
            bgView.backgroundColor = newValue
            backgroundView = bgView
        }
    }
}

L'utilisation est simple comme vous vous y attendiez auparavant:

headerView.backgroundColor = .red

Exemples d'utilisation :

1) Chez les délégués tableView:viewForHeaderInSection::

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tv.dequeueReusableHeaderFooterView(withIdentifier: "MyHeaderView")
    headerView.backgroundColor = .red // <- here
    return headerView
}

ou

2) Dans votre classe de vue d'en-tête personnalisée:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}
eli7ah
la source
Ok ... votre chemin est meilleur. :) Merci
Eli Burke le
1
Cette solution provoque une boucle récursive sur iOS 12.
Koppacetic
0

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

PSMy tableau se compose uniquement d'en-têtes sans aucune cellule.

user3106871
la source
0

Rapide:

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

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

la source
0

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

Puis j'ai soudainement décidé de déployer l'application pour iOS 9 car il y a des appareils (iPad mini d'une certaine génération plus ancienne ne se met à jour vers aucun système d'exploitation au-delà de 9) - La seule solution qui a fonctionné pour tous les iOS 9, 10 et 11 était de définir une vue de base pour l'en-tête qui contient ensuite toutes les autres sous-vues d'en-tête, de la relier à partir du storyboard et de définir la backgroundColorvue de base de cette vue.

Vous voudrez faire attention lors du câblage de la prise de ne pas l'appeler: backgroundViewcar il y a déjà une propriété avec ce nom dans certains superclass. J'ai appelé le miencontainingView

Lors du câblage de la commande de sortie, cliquez également sur la vue Document Outlinepour vous assurer qu'elle n'est pas câbléefile owner

Ahmed Khedr
la source
0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear
Shohin
la source
Bien que cela puisse répondre à la question, il a été signalé pour examen. Les réponses sans explication sont souvent considérées comme de mauvaise qualité. Veuillez commenter dans la réponse pourquoi c'est la bonne réponse.
Dan