it-swarm.com.de

UITableViewHeaderFooterView: Hintergrundfarbe kann nicht geändert werden

Ich versuche, die Hintergrundfarbe von UITableViewHeaderFooterView zu ändern. Obwohl die Ansicht angezeigt wird, bleibt die Hintergrundfarbe die Standardfarbe. Ich bekomme ein Protokoll von xcode und sagt:

Die Hintergrundfarbe für UITableViewHeaderFooterView wurde festgelegt 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.

97
Chun

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

72
Matt

iOS 8, 9, 10, 11 ...

Die einzige Möglichkeit, eine Farbe (mit einem beliebigen Alpha) festzulegen, ist backgroundView:

Swift

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 Kommentare unten)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
    
  • die backgroundView wird automatisch angepasst. (Keine Notwendigkeit, Einschränkungen hinzuzufügen)

  • Alpha mit UIColor(white: 0.5, alpha: 0.5) oder backgroundView.alpha = 0.5 steuern.
    (natürlich ist jede Farbe geeignet)

  • Wenn Sie XIB verwenden, machen Sie aus der Root-Ansicht eine UITableViewHeaderFooterView und verknüpfen Sie die backgroundView programmgesteuert:

    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 Animation wiederholen

► Diese Lösung finden Sie auf GitHub und weitere Details zu Swift Recipes .

161
SwiftArchitect

In iOS 7 arbeitete contentView.backgroundColor für mich, tintColor nicht.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Obwohl clearColor für mich nicht funktioniert hat, besteht die Lösung darin, die backgroundView-Eigenschaft 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];
17
sash

Stellen Sie sicher, dass Sie die backgroundColor der contentView für Ihre UITableViewHeaderFooterView setzen:

self.contentView.backgroundColor = [UIColor whiteColor];

Dann wird es klappen.

11
Rudolf J

Für mich habe ich alles Mögliche ausprobiert, erhielt aber immer noch die Warnung. "Das Festlegen der Hintergrundfarbe für UITableViewHeaderFooterView ist veraltet. Verwenden Sie stattdessen contentView.backgroundColor." Dann habe ich folgendes versucht: In der Xib-Datei wurde die Hintergrundfarbe für die Kopfansicht ausgewählt, um die Farbe zu löschen, anstatt die Standardeinstellung zu ändern, sobald ich sie in die Standardeinstellung geändert hatte. Die Warnung verschwand.  was this

 Changed to this

9
AmJa

Für eine klare Farbe verwende ich

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

Es scheint mir gut zu sein.

5
ChildhoodAndy

 enter image description here Im Schnittstellen-Builder ziehen Sie Ihre .xib-Datei im obersten Element hoch, setzen Sie im Attribut-Inspector die Hintergrundfarbe auf Standard. Gehen Sie dann in die Inhaltsansicht und legen Sie dort die Hintergrundfarbe fest (Referenz zu https://github.com/jiecao-fm/SwiftTheme/issues/24 ).

4
Hosny

wenn Sie eine benutzerdefinierte Unterklasse von UITableViewHeaderFooterView mit xib-Datei erstellt haben, sollten Sie setBackgroundColor überschreiben. Lass es leer. 

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

}

Und das löst dein Problem.

4
Voloda2

An iOS9 headerView.backgroundView.backgroundColor arbeitete 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 verwendete ich headerView.contentView.backgroundColor ohne Probleme, 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 gerade headerView.backgroundColor ausprobiert und den gleichen Fehler vom OP bekommen. 

Die Hintergrundfarbe für UITableViewHeaderFooterView wurde festgelegt veraltet Bitte verwenden Sie stattdessen contentView.backgroundColor.

Jetzt funktioniert alles gut und ohne Warnungen mit headerView.backgroundView.backgroundColor

4
Jan

Wenn Sie eine Abschnittskopfzeile mit Storyboard/Nib anpassen, stellen Sie sicher, dass die Hintergrundfarbe default für die Ansicht "Table Section Header" ist.

Und wenn Sie die Unterklasse UITableViewHeaderFooterView und die Spitze verwenden, müssen Sie eine IBOutlet für die Inhaltsansicht erstellen und diese beispielsweise benennen. containerView. Dies darf nicht mit contentView verwechselt werden, das dieser Containeransicht übergeordnet ist.

Mit diesem Setup ändern Sie stattdessen die Hintergrundfarbe von containerView.

4
samwize

Für einfarbige Hintergrundfarben sollte der contentView.backgroundColor ausreichend sein:

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

Für Farben mit Transparenz, einschließlich .clear color, 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 ????
    }
}

Legen Sie für einen vollständigen transparenten Abschnittsheader die backgroundView-Eigenschaft auf eine leere Ansicht fest:

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

Hüten Sie sich jedoch vor möglichen Nebenwirkungen. Wenn die Tabellenansicht nicht auf "Gruppiert" eingestellt ist, rasten die Abschnittsheader beim Scrollen nach unten oben ein. Wenn die Abschnittsheader transparent sind, wird der Zelleninhalt durchgesehen, was möglicherweise nicht besonders gut aussieht.

Abschnittsüberschriften haben hier einen transparenten Hintergrund:

 enter image description here

Um dies zu verhindern, ist es besser, den Hintergrund des Abschnittskopfs auf eine durchgehende Farbe (oder einen Farbverlauf) einzustellen, die dem Hintergrund Ihrer Tabellenansicht oder des Ansichtscontrollers entspricht.

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

 enter image description here

3
Eneko Alonso

Ich habe es mit der PräparationWhenContainedIn versucht, und es hat für mich funktioniert.

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

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
A.G

Ich fühle mich gezwungen, meine Erfahrungen zu teilen. Ich hatte dieses Stück Code, das gut mit iOS 10 und iOS 11 funktionierte. headerView?.contentView.backgroundColor = .lightGray 

Dann entschied ich mich plötzlich, die App für iOS 9 bereitzustellen, da es einige Geräte gibt (iPad Mini, ein älteres Betriebssystem, das nicht auf ein anderes Betriebssystem als 9 aktualisiert wird) Es wurde eine Basisansicht für die Kopfzeile definiert, die dann alle anderen Header-Untersichten enthält, vom Storyboard aus verdrahten und das backgroundColor dieser Basisansicht festlegen.

Sie sollten bei der Verkabelung der Steckdose aufpassen, dass Sie sie nicht nennen: backgroundView, da in superclass bereits eine Eigenschaft mit diesem Namen vorhanden ist. Ich rief meine containingView an

Klicken Sie auch beim Verkabeln der Ausgangssteuerung auf die Ansicht in Document Outline, um sicherzustellen, dass sie nicht mit file owner verdrahtet ist.

0
Ahmed Khedr

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

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

Das Festlegen der Hintergrundansicht mit einer klaren Farbe funktioniert gut für sichtbare Kopfzeilen .. Wenn die Tabelle gescrollt wird, um die Kopfzeilen unten anzuzeigen, schlägt diese Lösung fehl.

P.S.Meine Tabelle besteht nur aus Kopfzeilen ohne Zellen. 

0
user3106871

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.

0
kidnapper