UITableViewHeaderFooterView: Hintergrundfarbe kann nicht geändert werden

124

Ich versuche, die Hintergrundfarbe von UITableViewHeaderFooterView zu ändern. Obwohl die Ansicht angezeigt wird, bleibt die Hintergrundfarbe die Standardfarbe. Ich erhalte ein Protokoll von xcode mit der Aufschrift:

Das Festlegen der Hintergrundfarbe in UITableViewHeaderFooterView ist veraltet. Bitte verwenden Sie stattdessen contentView.backgroundColor.

Keine der folgenden Optionen funktioniert jedoch:

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

Ich habe auch versucht, die Hintergrundfarbe der Ansicht in der xib-Datei zu ändern.

Irgendwelche Vorschläge? Vielen Dank.

Chun
quelle
2
Verwenden Sie in iOS 13 contentView.backgroundColor, das für mich funktioniert hat. Ich denke, Apple hat dies aktualisiert
Tà Truhoada

Antworten:

94

Sie sollten entweder myTableViewHeaderFooterView.tintColor verwenden oder myTableViewHeaderFooterView.backgroundView eine benutzerdefinierte Hintergrundansicht zuweisen.

Matt
quelle
2
myTableViewHeaderFooterView.tintColor funktioniert einwandfrei. Danke für die Antwort!
Chun
15
Ich weiß nicht warum, aber für mich tintColorarbeite ich nicht an iOS7. Ich konnte die Farbe nur ändern, indem ich eine benutzerdefinierte Ansicht myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
zuwies
7
TintColor ist keine Hintergrundfarbe !!
João Nunes
189

iOS 8, 9, 10, 11 ...

Die einzige Möglichkeit, eine Farbe (mit einem Alpha) festzulegen, besteht darin, Folgendes zu verwenden backgroundView:

Schnell

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

Antworten auf Kommentare

  • Keine dieser anderen Optionen funktioniert zuverlässig (trotz der folgenden Kommentare)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
  • Die backgroundViewGröße wird automatisch geändert. (Keine Notwendigkeit, Einschränkungen hinzuzufügen)

  • Kontrolliere Alpha mit UIColor(white: 0.5, alpha: 0.5)oder backgroundView.alpha = 0.5.
    (Natürlich reicht jede Farbe)

  • Erstellen Sie bei Verwendung von XIB die Stammansicht a UITableViewHeaderFooterViewund ordnen Sie die backgroundViewprogrammgesteuert zu:

    Registrieren mit:

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

    Laden mit:

    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

↻ Animation wiedergeben

► Finden Sie diese Lösung auf GitHub und weitere Details zu Swift Recipes .

SwiftArchitect
quelle
5
contentView existiert deshalb nicht. Tintcolor soll die Ansicht tönen, nicht ihren Hintergrund. und Hintergrundfarbe ist veraltet. So ist Ihr Weg der Weg, um es zur Arbeit zu bringen. Übrigens nette Codesyntax
João Nunes
@ JoãoNunes, mit C # / Xamarin ist die Syntax noch ordentlicher:view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
Crishoj
In Xcode 6.1.1 erhalten Sie eine Laufzeitkonsolenwarnung:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori
Mit Xcode6.2 Beta5 habe ich immer noch die gleiche Warnung erhalten. Meine Erstellungsmethode von UITableViewHeaderFooterView basiert auf dem Laden von xib, das dem Apple-Beispielcode TVAnimationsGestures ähnelt. TVAnimationGestures mit Xcode6.2b5 generiert jedoch keine Warnmeldung. Apple-Code hat überhaupt keine Hintergrundzeichenfolge. Natürlich ist uitableVuewHeaderFooterview.contentView in TVAnimationsGestures gleich Null. Ich verstehe nicht, warum das passiert.
kmugitani
7
Für Personen, die weiterhin die Warnung erhalten: Stellen Sie sicher, dass für UITableViewHeaderFooterView in IB keine Hintergrundfarbe festgelegt ist.
Tuslareb
24

In iOS 7 contentView.backgroundColorhat bei mir tintColornicht funktioniert.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Obwohl clearColores für mich nicht funktioniert hat, besteht die Lösung darin, die backgroundViewEigenschaft auf ein transparentes Bild zu setzen. Vielleicht hilft es jemandem:

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

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];
Schärpe
quelle
Ich denke, dies ist ein besserer Ansatz als die Antwort von @SwiftArchitect (obwohl es funktioniert hat). Die Tatsache, dass Sie kein neues UIView hinzufügen müssen, macht es viel besser. Hat perfekt für mich funktioniert.
Erick A. Montañez
14

Stellen Sie sicher, dass Sie die Hintergrundfarbe contentViewfür Folgendes festlegen UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Dann wird es funktionieren.

Rudolf J.
quelle
Nur iOS> = 10!. Für iOS <10 verwenden Sie: backgroundView? .BackgroundColor = UIColor.white
Peter Kreinz
12

Für mich habe ich alles versucht, was oben angegeben wurde, aber immer noch die Warnung "Das Einstellen der Hintergrundfarbe in UITableViewHeaderFooterView ist veraltet. Bitte verwenden Sie stattdessen contentView.backgroundColor." Dann habe ich Folgendes versucht: In der XIB-Datei wurde die Hintergrundfarbe für die Kopfzeilenansicht ausgewählt, um die Farbe anstelle der Standardeinstellung zu löschen, sobald ich sie auf Standard geändert habe. Die Warnung wurde ausgeblendet. war das

Daran geändert

AmJa
quelle
7

Für eine klare Farbe verwende ich

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

Es scheint mir in Ordnung zu sein.

KindheitAndy
quelle
1
Einstellen backgroundView = UIView()und dann backgroundColor = .clearwar die einzige funktionierende Lösung. Danke dir.
Vive
7

Für einfarbige Hintergrundfarben contentView.backgroundColorsollte die Einstellung ausreichend sein:

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

Bei Farben mit Transparenz, einschließlich .clearFarbe, funktioniert dies nicht mehr:

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

Setzen Sie die backgroundViewEigenschaft für eine vollständig transparente Abschnittsüberschrift auf eine leere Ansicht:

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

Achten Sie jedoch auf mögliche Nebenwirkungen. Sofern die Tabellenansicht nicht auf "Gruppiert" eingestellt ist, werden die Abschnittsüberschriften beim Scrollen nach oben oben eingerastet. Wenn die Abschnittsüberschriften transparent sind, wird der Zelleninhalt durchsichtig, was möglicherweise nicht gut aussieht.

Hier haben Abschnittsüberschriften einen transparenten Hintergrund:

Geben Sie hier die Bildbeschreibung ein

Um dies zu verhindern, ist es besser, den Hintergrund der Abschnittsüberschrift auf eine Volltonfarbe (oder einen Farbverlauf) einzustellen, die dem Hintergrund Ihrer Tabellenansicht oder Ihres Ansichtscontrollers entspricht.

Hier haben Abschnittsüberschriften einen vollständig undurchsichtigen Hintergrund mit Farbverlauf:

Geben Sie hier die Bildbeschreibung ein

Eneko Alonso
quelle
Genius! Das Definieren einer leeren UIView für backgroundView hat das Problem für mich vollständig gelöst! Vielen Dank!
Luiz Dias
6

Geben Sie hier die Bildbeschreibung einRufen Sie im Interface Builder Ihre .xib-Datei im obersten Element auf und setzen Sie im Attributinspektor die Hintergrundfarbe auf Standard. Gehen Sie dann zur Inhaltsansicht und legen Sie dort die Hintergrundfarbe fest (siehe https://github.com/jiecao-fm/SwiftTheme/issues/24 ).

Hosny
quelle
4

Auf iOS9 headerView.backgroundView.backgroundColor funktionierte für mich:

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

Unter iOS8 habe ich headerView.contentView.backgroundColorohne Probleme verwendet, aber jetzt mit iOS 9 bekam ich ein seltsames Problem, bei dem die Hintergrundfarbe nicht den gesamten Raum der Zelle ausfüllte. Also habe ich es einfach versucht headerView.backgroundColorund ich habe den gleichen Fehler vom OP bekommen.

Das Festlegen der Hintergrundfarbe in UITableViewHeaderFooterView ist veraltet. Bitte verwenden Sie stattdessen contentView.backgroundColor.

So funktioniert jetzt alles super und ohne Warnungen mit headerView.backgroundView.backgroundColor

Jan.
quelle
4

Wenn Sie eine benutzerdefinierte Unterklasse UITableViewHeaderFooterViewmit xibDatei erstellt haben, sollten Sie diese überschreiben setBackgroundColor. Lass es leer.

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

}

Und das wird Ihr Problem lösen.

Voloda2
quelle
Das ist die richtige Antwort für mich. Obwohl ich in meiner HeaderFooterView keine Hintergrundfarbe festgelegt habe, wird die Warnmeldung weiterhin in meinem Konsolenprotokoll angezeigt. So nervig!
Stan Liu
4

Wenn Sie eine Abschnittsüberschriftenzelle mit Storyboard / Nib anpassen , stellen Sie sicher, dass die Hintergrundfarbe für die Ansicht "Tabellenabschnittsüberschrift" standardmäßig ist .

Wenn Sie eine Unterklasse verwenden UITableViewHeaderFooterViewund nib verwenden, müssen Sie lediglich eine IBOutletfür die Inhaltsansicht erstellen und diese z. containerView. Dies ist nicht zu verwechseln mit contentViewdem übergeordneten Element dieser Containeransicht.

Mit diesem Setup ändern Sie containerViewstattdessen die Hintergrundfarbe von .

Samwize
quelle
1

Ich habe es mit der Erscheinungsbild-Kette WhenContainedIn versucht, und es hat bei mir funktioniert.

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

Vielleicht, weil die Hintergrundansicht nicht existiert

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

diese Arbeit für mich.

andrew54068
quelle
1

iOS 12, Swift 5. Wenn Sie bereit (oder versucht!) Sind, einen Erscheinungs-Proxy zu verwenden, funktioniert die folgende Lösung:

  1. Unterklasse UITableViewHeaderFooterView und legen Sie Ihre eigene Proxy-Einstellung für das Erscheinungsbild offen.
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. Stellen Sie den Darstellungs-Proxy auf die gewünschte Granularität ein.
MySectionHeaderView.appearance().forceBackgroundColor = .red

oder

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

Vergiss die Schwierigkeiten.

Fügen Sie Ihrem Projekt den folgenden UITableViewHeaderFooterView+BGUpdate.swiftCode hinzu:

extension UITableViewHeaderFooterView {

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

Die Verwendung ist wie erwartet einfach:

headerView.backgroundColor = .red

Anwendungsbeispiele :

1) Im Delegierten tableView:viewForHeaderInSection::

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

oder

2) In Ihrer benutzerdefinierten Header-Ansichtsklasse:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}
eli7ah
quelle
Ok ... dein Weg ist besser. :) Danke
Eli Burke
1
Diese Lösung verursacht eine rekursive Schleife unter iOS 12.
Koppacetic
0

Das Einstellen der Hintergrundansicht mit klarer Farbe funktioniert gut für sichtbare Überschriften. Wenn die Tabelle gescrollt wird, um die Überschriften unten anzuzeigen, schlägt diese Lösung fehl.

Die PSMy-Tabelle besteht nur aus Headern ohne Zellen.

user3106871
quelle
0

Schnell:

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

Erstellen Sie UIView, legen Sie die Hintergrundfarbe fest und setzen Sie sie dann auf self.backgroundView.

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

quelle
0

Ich fühle mich gezwungen, meine Erfahrungen zu teilen. Ich hatte diesen Code, der mit iOS 10 und iOS 11 gut funktionierteheaderView?.contentView.backgroundColor = .lightGray

Dann entschied ich mich plötzlich, die App für iOS 9 bereitzustellen, da es einige Geräte gibt (iPad mini, einige ältere Generationen aktualisieren nicht auf ein Betriebssystem über 9 hinaus) - Die einzige Lösung, die für alle iOS 9, 10 und 11 funktioniert war es, eine Basisansicht für den Header zu definieren, die dann alle anderen Header-Unteransichten enthält, sie vom Storyboard aus zu verbinden und die backgroundColorBasisansicht festzulegen .

Sie sollten bei der Verkabelung der Steckdose darauf achten, sie nicht anzurufen, backgroundViewda es in einigen bereits eine Eigenschaft mit diesem Namen gibt superclass. Ich habe meine angerufencontainingView

Klicken Sie auch bei der Verkabelung der Steckdosensteuerung auf die Ansicht Document Outline, um sicherzustellen, dass sie nicht verkabelt istfile owner

Ahmed Khedr
quelle
0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear
Shohin
quelle
Dies kann zwar die Frage beantworten, wurde jedoch zur Überprüfung markiert. Antworten ohne Erklärung werden oft als minderwertig angesehen. Bitte geben Sie in der Antwort einen Kommentar an, warum dies die richtige Antwort ist.
Dan