UITableViewHeaderFooterView: impossibile cambiare il colore di sfondo


124

Sto cercando di cambiare il colore di sfondo di UITableViewHeaderFooterView. Sebbene la visualizzazione venga visualizzata, il colore di sfondo rimane il colore predefinito. Ricevo un registro da xcode che dice:

L'impostazione del colore di sfondo su UITableViewHeaderFooterView è stata deprecata. Utilizzare invece contentView.backgroundColor.

Tuttavia, nessuna delle seguenti opzioni funziona:

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

Ho anche provato a cambiare il colore di sfondo della vista nel file xib.

Eventuali suggerimenti? Grazie.


2
in iOS 13, usa contentView.backgroundColor ha funzionato per me. Penso che Apple abbia aggiornato questo
Tà Truhoada

Risposte:


95

È necessario utilizzare myTableViewHeaderFooterView.tintColor o assegnare una visualizzazione di sfondo personalizzata a myTableViewHeaderFooterView.backgroundView.


2
myTableViewHeaderFooterView.tintColor funziona perfettamente. Grazie per la risposta!
Chun

15
Non so perché, ma per me tintColornon funziona su iOS7. Potrei cambiare colore solo assegnando la visualizzazione personalizzata:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
skywinder

7
TintColor non è il colore di sfondo !!
João Nunes

189

iOS 8, 9, 10, 11 ...

L'unico modo per impostare qualsiasi colore (con qualsiasi alfa) è usare backgroundView:

veloce

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

Risposte ai commenti

  • Nessuna di queste altre opzioni funziona in modo affidabile (nonostante i commenti di seguito)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
  • la backgroundViewviene automaticamente ridimensionata. (Non è necessario aggiungere vincoli)

  • Controlla alfa con UIColor(white: 0.5, alpha: 0.5)o backgroundView.alpha = 0.5.
    (ovviamente, qualsiasi colore andrà bene)

  • Quando si usa XIB , rendere la visualizzazione root a UITableViewHeaderFooterViewe associare a livello di backgroundViewcodice:

    Registrati con:

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

    Carica con:

    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
    }

dimostrazione

↻ replay animazione

► Trova questa soluzione su GitHub e ulteriori dettagli su Swift Recipes .


5
contentView non esiste ecco perché. tintcolor serve per colorare la vista e non lo sfondo. e backgroundcolor è deprecato. Così il tuo modo è il modo per farlo funzionare. Btw bella sintassi del codice
João Nunes

@ JoãoNunes, con C # / Xamarin la sintassi è ancora più ordinata: view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
ordinata

In Xcode 6.1.1, ricevi un avviso della console di runtime:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori

Con Xcode6.2 beta5, ho ancora lo stesso avviso. Il mio metodo di creazione di UITableViewHeaderFooterView si basa sul caricamento di xib che è simile al codice di esempio Apple, TVAnimationsGestures. Tuttavia, TVAnimationGestures con Xcode6.2b5 non genera alcun messaggio di avviso. Il codice Apple non ha affatto la stringa "background". Ovviamente, uitableVuewHeaderFooterview.contentView è nullo in TVAnimationsGestures. Non capisco perché sia ​​successo.
kmugitani

7
Per le persone che continuano a ricevere l'avviso: assicurati che UITableViewHeaderFooterView non abbia un backgroundColor impostato in IB.
Tuslareb

24

In iOS 7 ha contentView.backgroundColorfunzionato per me, tintColorno.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Sebbene clearColornon abbia funzionato per me, la soluzione che ho trovato è impostare la backgroundViewproprietà su un'immagine trasparente. Forse aiuterà qualcuno:

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

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

Penso che questo sia un approccio migliore rispetto alla risposta di @SwiftArchitect (sebbene abbia funzionato). Il fatto che non sia necessario aggiungere un nuovo UIView lo rende molto migliore. Ha funzionato perfettamente per me.
Erick A. Montañez

14

Assicurati di impostare il colore di sfondo contentViewper il tuo UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Allora funzionerà.


iOS> = solo 10 !. Per iOS <10 usa: backgroundView? .BackgroundColor = UIColor.white
Peter Kreinz

12

Per quanto mi riguarda, ho provato tutto quanto indicato sopra, ma ricevevo ancora l'avviso "L'impostazione del colore di sfondo su UITableViewHeaderFooterView è stata deprecata. Utilizza invece contentView.backgroundColor." poi ho provato questo: all'interno del file xib il colore di sfondo per la visualizzazione dell'intestazione è stato selezionato per cancellare il colore invece del colore predefinito una volta che l'ho cambiato in default l'avviso è scomparso. era questo

Cambiato in questo


7

Per un colore chiaro, io uso

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

A me sembra a posto.


1
Setting backgroundView = UIView()and then backgroundColor = .clearera l'unica soluzione funzionante. Grazie.
Vive

7

Per colori di sfondo a tinta unita, l'impostazione di contentView.backgroundColordovrebbe essere sufficiente:

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

Per i colori con trasparenza, compreso il .clearcolore, non funziona più:

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

Per un'intestazione di sezione completamente trasparente, imposta la backgroundViewproprietà su una vista vuota:

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

Tuttavia, fai attenzione ai possibili effetti collaterali. A meno che la vista tabella non sia impostata su "Raggruppata", le intestazioni di sezione si agganceranno in alto durante lo scorrimento verso il basso. Se le intestazioni delle sezioni sono trasparenti, il contenuto della cella sarà visibile, il che potrebbe non sembrare eccezionale.

Qui, le intestazioni delle sezioni hanno uno sfondo trasparente:

inserisci qui la descrizione dell'immagine

Per evitare ciò, è meglio impostare lo sfondo dell'intestazione della sezione su un colore a tinta unita (o sfumatura) corrispondente allo sfondo della vista tabella o del controller della vista.

Qui, le intestazioni di sezione hanno uno sfondo sfumato completamente opaco:

inserisci qui la descrizione dell'immagine


Genio! La definizione di una UIView vuota per backgroundView ha risolto completamente il problema per me! Grazie!
Luiz Dias


4

Su iOS9 ha headerView.backgroundView.backgroundColor funzionato per me:

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

Su iOS8 stavo usando headerView.contentView.backgroundColorsenza problemi, ma ora con iOS 9, ho riscontrato uno strano problema che impediva al colore di sfondo di riempire l'intero spazio della cella. Quindi ho provato headerView.backgroundColore ho ricevuto lo stesso errore dall'OP.

L'impostazione del colore di sfondo su UITableViewHeaderFooterView è stata deprecata. Utilizzare invece contentView.backgroundColor.

Quindi ora tutto funziona alla grande e senza avvisi utilizzando headerView.backgroundView.backgroundColor


4

se hai creato una sottoclasse personalizzata di UITableViewHeaderFooterViewwith xibfile, dovresti sovrascrivere setBackgroundColor. Tienilo vuoto.

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

}

E questo risolverà il tuo problema.


Questa è la risposta corretta per me. Sebbene non abbia impostato alcun colore di sfondo nel mio HeaderFooterView, il messaggio di avviso continua a essere visualizzato nel registro della console. Così fastidioso!
stan liu

4

Se stai personalizzando una cella di intestazione di sezione con Storyboard / Pennino , assicurati che il colore di sfondo sia predefinito per la vista "Intestazione sezione tabella".

E se si sottoclasse UITableViewHeaderFooterViewe si utilizza pennino, quello che si deve fare è creare una IBOutletper la visualizzazione del contenuto e denominarla ad es. containerView. Questo non deve essere confuso con contentView, che è il genitore di questa vista contenitore.

Con quella configurazione, invece, cambi il colore di sfondo containerView.


1

Ho provato con la catena apparenzaWhenContainedIn e ha funzionato per me.

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

1

forse perché backgroundView non esiste

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

che funziona per me.


1

iOS 12, Swift 5. Se desideri (o provi!) a utilizzare un proxy di aspetto, la seguente soluzione funziona:

  1. Sottoclasse UITableViewHeaderFooterView ed esponi la tua impostazione proxy di aspetto.
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. Imposta il proxy dell'aspetto con la granularità desiderata.
MySectionHeaderView.appearance().forceBackgroundColor = .red

o

MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red

1

Dimentica le difficoltà.

Aggiungi al tuo progetto UITableViewHeaderFooterView+BGUpdate.swiftcon il codice qui sotto:

extension UITableViewHeaderFooterView {

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

L'utilizzo è semplice come ti aspettavi prima:

headerView.backgroundColor = .red

Esempi di utilizzo :

1) In delegato tableView:viewForHeaderInSection::

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

o

2) Nella classe di visualizzazione dell'intestazione personalizzata:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}

Ok ... a modo tuo è migliore. :) Grazie
Eli Burke

1
Questa soluzione causa un ciclo ricorsivo su iOS 12.
Koppacetic

0

L'impostazione di BackgroundView con colori chiari funziona bene per le intestazioni visibili. Se si scorre la tabella per mostrare le intestazioni in fondo, questa soluzione non riesce.

La tabella PSMy è composta solo da intestazioni senza celle.


0

Swift:

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

0

Crea UIView e imposta il colore di sfondo, quindi impostalo su self.backgroundView.

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

0

Mi sento obbligato a condividere la mia esperienza. Avevo questo pezzo di codice che funzionava bene con iOS 10 e iOS 11headerView?.contentView.backgroundColor = .lightGray

Poi all'improvviso ho deciso di distribuire l'app per iOS 9 poiché ci sono alcuni dispositivi (iPad mini di vecchia generazione non si aggiorna a nessun sistema operativo oltre il 9) - L'unica soluzione che ha funzionato per tutti gli iOS 9, 10 e 11 era quello di definire una vista di base per l'intestazione che poi contiene tutte le altre sottoviste di intestazione, collegarla dallo storyboard e impostare la visualizzazione backgroundColordi quella base.

Dovrai stare attento quando colleghi la presa a non chiamarla: backgroundViewpoiché in alcuni c'è già una proprietà con quel nome superclass. Ho chiamato il miocontainingView

Inoltre, quando si collega il controllo della presa, fare clic sulla vista Document Outlineper assicurarsi che non sia collegato afile owner


0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear

Sebbene questo possa rispondere alla domanda, è stato contrassegnato per la revisione. Le risposte senza spiegazione sono spesso considerate di bassa qualità. Si prega di fornire qualche commento nella risposta per spiegare perché questa è la risposta corretta.
Dan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.