UITableViewCell zeigt weißen Hintergrund und kann unter iOS7 nicht geändert werden

186

Ich habe eine benutzerdefinierte Tabellenklasse für Tabellenansichten implementiert, von der geerbt wird UITableViewCell. Die Tabellenansicht enthält ein Hintergrundbild, daher soll der Hintergrund der Zelle transparent sein. Es sieht gut aus vor iOS7.

In iOS7 wird die Zelle jedoch immer mit einem weißen Hintergrund angezeigt.


Selbst für Xcode7, 2015 gibt es einen Fehler im Storyboard : Sie müssen die Hintergrundfarbe einer Zelle im Code festlegen.

Kjuly
quelle
Sie können die Hintergrundfarbe der Zelle direkt ändern, indem Sie auf die Hintergrundfarbe ihrer Eigenschaft zugreifen. cell.backgroundColor = [UIColor clearColor];
ViruMax

Antworten:

384

Wie Apple DOC sagte ( UITableViewCell Class Reference ):

... In iOS 7 haben Zellen standardmäßig einen weißen Hintergrund . In früheren Versionen von iOS erben Zellen die Hintergrundfarbe der umschließenden Tabellenansicht. Wenn Sie die Hintergrundfarbe einer Zelle ändern möchten, tun Sie dies in der tableView: willDisplayCell: forRowAtIndexPath: -Methode Ihres Tabellenansichtsdelegierten.

Für meinen Fall, dass zum Anzeigen von Zellen mit transparentem Hintergrund lediglich die Delegate-Methode im Tabellenansichts-Controller wie folgt implementiert werden muss:

- (void)tableView:(UITableView *)tableView
  willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
  [cell setBackgroundColor:[UIColor clearColor]];
}

Nur Hinweis : Wie @null sagte: "... es scheint einen Fehler im Interface Builder zu geben ..." , bin ich mir nicht ganz sicher, ob es den Fehler gibt, aber es scheint so, weil sein Kommentar mehrere Stimmen erhalten hat. Wenn Sie also IB verwenden, stimmt möglicherweise etwas nicht. :) :)

Kjuly
quelle
53
Leider nicht wahr, es scheint einen Fehler im Interface Builder zu geben, und ich konnte ihn nicht über das Storyboard auf meine benutzerdefinierte Zelle einstellen.
Tarek Hallak
1
@null, aha, iOS 7 SDK scheint immer noch viele Fehler zu haben, die behoben werden müssen. Ich habe bereits einige getroffen, aber für Storyboard habe ich keine Ahnung. :)
Kjuly
4
Sie können dies auch in der tableView:cellForRowAtIndexPath:Methode tun .
Bugloaf
1
@ KendallHelmstetterGelner sicher? Ich habe es noch nicht bemerkt, scheint immer noch für mich zu funktionieren. :)
Kjuly
1
Wie Bugloaf oben sagt - mach es in tableView: cellForRowAtIndexPath:
Amergin
66

Ich habe es ein wenig untersucht und festgestellt, dass die Zellenhintergrundfarbe vom Darstellungssystem festgelegt wird. Wenn also alle Zellen in Ihrer Anwendung einen klaren Hintergrund haben, wäre die einfachste Lösung:

[[UITableViewCell appearance] setBackgroundColor:[UIColor clearColor]];

Und selbst wenn sie einen anderen Hintergrund haben, scheint eine klare Farbe als Standard am bequemsten zu sein.

Anton Filimonov
quelle
1
Du mein Freund bist ein Monster. Ich unterklage alle meine UITableViewCells, daher war es für mich kein Problem, einer Oberklasse einen Initialisierer zur Verfügung zu stellen, auf den die Hintergrundfarbe eingestellt werden kann clearColor, aber wissen Sie was? Das hat nicht funktioniert ... Ich meine, WARUM, APFEL?
Mazyod
Das funktioniert. Die weiße Farbe wird jedoch nicht angezeigt. Ging mit Top-Antwort für den besten Effekt (kein Knallen).
Carl Prehn
@Anton Filimonov Ich habe das Erscheinungsbild der Zellen in der Tabellenansicht in meinem Appdelegate jetzt in einem bestimmten viewController festgelegt. Ich möchte eine andere Farbe für die Zelle haben. Wie kann ich mich diesem Szenario nähern? Ich habe versucht, in der CellWillDisplay-Delegatenmethode eine andere Farbe festzulegen, aber keine Auswirkung. Könnten Sie mir bitte dabei helfen
Peer Mohamed Thabib
@PeerMohamedThabib Bitte erzählen Sie mehr über die Umgebung (iPad / iPhone, iOS-Version) und geben Sie Code ein. Und tatsächlich können Sie die Situation selbst untersuchen - erstellen Sie einfach eine Unterklasse von UITableViewCell, definieren Sie die setBackgroundColor: -Methode neu (rufen Sie einfach die Implementierung der Superklasse auf) und setzen Sie einen Haltepunkt für diese Methode, und Sie werden sehen, was die Zellenfarbe ändert, nachdem Sie sie festgelegt haben inside tableView: willDisplayCellAtIndexPath:
Anton Filimonov
1
Selbst wenn Sie gemischte Zellen haben, einige mit Hintergrund und einige ohne (transparent). Am einfachsten ist es, eine benutzerdefinierte Klasse zu definieren und denselben Code zu schreiben. Auf diese Weise bleiben alle UITableViewCell-Klassen auf dem Standardwert und benutzerdefinierte Klassen haben eine klare Farbe. [[CustomTableCell-Darstellung] setBackgroundColor: [UIColor clearColor]]; Dies wirkt sich nicht auf defekte UITableViewCells aus und wirkt sich nur auf benutzerdefinierte Zellen aus.
Ansari
30

Schreiben Sie dies in Ihre cellForRowAtIndexPath-Methode, bevor Sie cell zurückgeben.

cell.backgroundColor = [UIColor clearColor];
Sanjana
quelle
1
Dies half mir bei einem Problem in iOS 8 auf dem iPhone 5.
Almo
13

Die Standardhintergrundfarbe eines UITableViewCellin iOS 7 ist Weiß.

Sie müssen die backgroundColorEigenschaft irgendwo in Ihrem Code festlegen . Legen Sie es beispielsweise fest, nachdem Sie die Zelle neu erstellt haben.

cell.backgroundColor = [UIColor clearColor];
Yiming Tang
quelle
Ich habe es versucht, aber es hat bei mir nicht funktioniert. Bist du sicher, dass es funktioniert?
Matrosov Alexander
Funktioniert für mich für eine benutzerdefinierte Tabellenansichtszelle in der Methode initWithCoder: aDecoder.
ftvs
13

Ich habe tatsächlich festgestellt, dass das Problem darauf zurückzuführen ist, dass die Hintergrundfarbe von UITableView nicht auf klar eingestellt ist. Wenn Sie die Hintergrundfarbe der UITableViewCell in "Löschen" ändern und feststellen, dass immer noch Weiß angezeigt wird, stellen Sie sicher, dass die Hintergrundfarbe der UITableView auf "Löschen" eingestellt ist (oder was auch immer Sie möchten).

[self.tableView setBackgroundView:nil];
[self.tableView setBackgroundColor:[UIColor clearColor]];

In Swift

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()
Endama
quelle
Nur zu Ihrer Information, Sie können dies auch in IB einstellen. Stellen Sie einfach sicher, dass Sie die Hintergrundfarbe im Bereich "Ansicht" ändern und nicht nur im Abschnitt "Tabellenansicht", der anscheinend keine spürbaren Auswirkungen hat.
AndyDunn
1
das hat auch bei mir funktioniert, ich habe nach der schnellen version gesucht. Hinzugefügt, was für mich im Code
funktioniert
10

Dies ist definitiv ein iOS-Fehler. In iOS 8 Interface Builderfunktioniert das Einstellen der Hintergrundfarbe für das iPhone einwandfrei, für das iPad jedoch immer whiteColor. Um dies zu beheben, geben Sie in der cellForIndexPathDatenquellennachricht Folgendes ein:

cell.backgroundColor = cell.backgroundColor

Und es wird funktionieren. Genau aus diesem Grund habe ich gesagt, dass es ein Fehler ist, da der Code selbst ziemlich beschissen ist, aber er funktioniert.

superarts.org
quelle
Immer noch der Fall für Xcode7 / iOS9. Ich habe den expliziten Code in tableView: willDisplayCell: forRowAtIndexPath wie oben vorgeschlagen hinzugefügt.
Andrew Duncan
In XCode 7.0.1 zeigte das Kompilieren der Universal-App einen schwarzen Hintergrund auf dem iPhone mit iOS 7,8,9, aber einen weißen Hintergrund auf dem iPad mit iOS 9.0.2 (und wahrscheinlich auch andere, kann dies jedoch nicht überprüfen). Der obige Code hat das Problem behoben.
ScottyB
Für statische tableView überschreiben Sie willDisplayCell mit cell.backgroundColor = UIColor.clearColor (). Das Neuzuweisen der Farbkonfiguration in IB hat bei mir nicht funktioniert.
Viktor Kucera
4

Möglicherweise ist Ihre UITableViewCell standardmäßig ausgewählt. Sie können dies mit dem neuen visuellen Debugger von Xcode 6s bestätigen (oder genau herausfinden, in welcher Ansicht diese weiße Zelle angezeigt wird ).

Geben Sie hier die Bildbeschreibung ein

Interessanterweise hat es nach dem Wissen, dass das Einstellen der Hintergrundfarbe der ausgewählten Zelle zum Löschen immer noch nicht funktioniert hat. Es stellte sich heraus, dass ich nur den Auswahlstil ändern musste, als ich diese benutzerdefinierte Zelle erstellte:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // do customization here
    }
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    [self setBackgroundColor:[UIColor clearColor]];
    return self;
}
Abbood
quelle
defekter Link für visuellen Debugger
Suragch
3

Ich fand heraus, dass keines der oben genannten Funktionen unter XCode 5.1.1, iOS 7.1 funktioniert.

Wenn Sie Interface Builder mit Prototypzellen verwenden, wählen Sie die Prototypzelle aus und ändern Sie in der Attributauswahl im Abschnitt Ansicht die Standardeinstellung für das Hintergrundformular in Farbe löschen:

Geben Sie hier die Bildbeschreibung ein

Dies scheint gut zu funktionieren. Keine der oben genannten Codeänderungen ist erforderlich - dies ist eine reine IB-Lösung.

Mike
quelle
2

Die akzeptierte Antwort hat das Problem für mich nicht behoben. Ich musste das machen:

  1. Wählen Sie im Interface Builder die Tabellenansicht aus. Stellen Sie dann im Attributinspektor im Abschnitt Ansicht den Hintergrund auf transparent ein (0% Deckkraft).

Geben Sie hier die Bildbeschreibung ein

  1. Aus der Datenquellenklasse cellForRowAtIndexPath der Tabelle:

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent
RajV
quelle
Nun, Sie verwenden den Interface Builder. Wie @null unter meiner Antwort kommentierte: "... es scheint einen Fehler im Interface Builder zu geben ..." , bin ich mir nicht ganz sicher, ob es den Fehler gibt, aber das scheint so zu sein Kommentar bekam mehrere Stimmen. ;)
Kjuly
Etwas in iOS7 ist definitiv fehlerhaft, wenn es um transparenten Zellenhintergrund geht. Ich hoffe, meine Antwort hilft anderen, die sich in einer ähnlichen Situation wie ich befinden.
RajV
Dies ist nicht der richtige Weg, um Zellen für Ihre Tabellenansicht zu erstellen, insbesondere wenn Sie Interface Builder / Storyboards verwenden. Im Code-Snippet erstellen Sie jedes Mal eine neue Zelle, wenn Ihr Delegierter nach einer gefragt wird. Dies ist keine Wiederverwendung! Um die Leistungsvorteile der Wiederverwendung von Zellen zu nutzen, sollten Sie diese verwenden cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. In früheren Versionen löschen Sie das indexPath-Argument und testen dann auf Null, wobei Sie initWithStyle:reuseIdentifiergemäß Ihrem Code-Snippet im Fall Null instanziieren .
Ikuramedia
ikuramedia: Ich habe den Wiederverwendungscode aus meinem Beitrag herausgelassen. Natürlich verwende ich Zellen wieder. Darum geht es in diesem Beitrag nicht.
RajV
2

Für mich cell.backgroundColor = cell.contentView.backgroundColor; entweder eingestellt tableView:willDisplayCell:forRowAtIndexPath:oder tableView:cell:forRowAtIndexPath:den Job gemacht.

Dies liegt daran, dass ich die Hintergrundfarbe von contentView im Interface Builder wie gewünscht festgelegt habe.

mllm
quelle
1

Beim Hinzufügen von UI-Objekten zu einer Zelle fügt Xcode 5 / IOS 7 eine neue "Inhaltsansicht" hinzu, die die Übersicht aller Elemente in der Zelle darstellt. Um die Hintergrundfarbe der Zelle festzulegen, legen Sie die Hintergrundfarbe dieser Inhaltsansicht fest. Die obigen Lösungen haben bei mir nicht funktioniert, aber diese hat bei mir gut funktioniert.

DrBug
quelle
Die Inhaltsansicht ist auch in früheren SDK-Versionen verfügbar. Sie legen lediglich eine Hintergrundfarbe für die Inhaltsansicht fest, die die Hintergrundansicht der Zelle abdeckt.
Kjuly
Nun, es wird nicht automatisch im Interface Builder vor xcode 5 angezeigt. Was genau ist Ihr Punkt?
DrBug
Ich meine, Ihre Antwort wurde für ein anderes Thema besprochen, nicht für meine Frage. Sie möchten nur eine Hintergrundfarbe für Ihre Zelle festlegen, oder? Unabhängig davon, ob Zellen in iOS 7 standardmäßig einen weißen Hintergrund haben oder nicht, können Sie ihn jederzeit implementieren, indem Sie eine Farbe für die Inhaltsansicht festlegen, da die Inhaltsansicht über der Hintergrundansicht der Zelle liegt. Sinn ergeben? ;)
Kjuly
1

Swift 1.2 Lösung:

Fügen Sie einfach eine explizite Definition für die Hintergrundfarbe Ihrer Zelle hinzu:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // Configure the cell...
    cell.backgroundColor = UIColor.clearColor()

    return cell
}
Dan Beaulieu
quelle
Es tut uns leid. Es ist mein Fehler. Es klappt. Ich habe einige andere Einstellungen verpasst.
Sung Kim
1

Hatte ein ähnliches Problem, musste

  1. Stellen Sie Blau als Auswahlstil und ein
  2. Fügen Sie dies dem Code hinzu, um es zu korrigieren

    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    
      var bgColorView: UIView = UIView()
      bgColorView.backgroundColor = UIColor(red: (76.0 / 255.0), green: (161.0 / 255.0), blue: (255.0 / 255.0), alpha: 1.0)
      bgColorView.layer.masksToBounds = true
      tableView.cellForRowAtIndexPath(indexPath)!.selectedBackgroundView = bgColorView
      return true
    }
Nakul Sudhakar
quelle
0

Sie können auch Farbcode verwenden, um Ihre UITableView Cell lukrativ zu machen.

[cell setBackgroundColor:[self colorWithHexString:@"1fbbff"]];

Dies ist der Code zum Anwenden der Farbcodemethode:

-(UIColor*)colorWithHexString:(NSString*)hex
{
    NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];


    if ([cString length] < 6) return [UIColor grayColor];

    if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];

    if ([cString length] != 6) return  [UIColor grayColor];

    NSRange range;
    range.location = 0;
    range.length = 2;
    NSString *rString = [cString substringWithRange:range];

    range.location = 2;
    NSString *gString = [cString substringWithRange:range];

    range.location = 4;
    NSString *bString = [cString substringWithRange:range];

    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];

    return [UIColor colorWithRed:((float) r / 255.0f)
                         green:((float) g / 255.0f)
                          blue:((float) b / 255.0f)
                         alpha:1.0f];
}
MahboobiOSDeveloper
quelle