Wie kann ich die Hintergrundfarbe einer UITableViewCell anpassen?

188

Ich möchte den Hintergrund (und möglicherweise auch den Rand) aller UITableViewCells in meiner UITableView anpassen. Bisher konnte ich dieses Material nicht anpassen, daher habe ich eine Reihe weißer Hintergrundzellen, was die Standardeinstellung ist.

Gibt es eine Möglichkeit, dies mit dem iPhone SDK zu tun?

jpm
quelle

Antworten:

193

Sie müssen die Hintergrundfarbe der Inhaltsansicht der Zelle auf Ihre Farbe einstellen. Wenn Sie Zubehör verwenden (z. B. Offenlegungspfeile usw.), werden diese als weiß angezeigt, sodass Sie möglicherweise benutzerdefinierte Versionen davon rollen müssen.

Ben Gottlieb
quelle
108
zB myCell.contentView.backgroundColor = [UIColor greenColor];
JoBu1324
1
vlado.grigorovs Antwort ist flexibler - siehe William Denniss 'Antwort
JoBu1324
3
Gibt es zum Beispiel Links, wie man sich selbst rollen kann UITableViewCellAccessoryCheckmark? Vielen Dank.
Dan Rosenstark
6
Um es manchmal zu sehen, müssen Sie einstellen:cell.textLabel.backgroundColor = [UIColor clearColor];
Evan Moran
205

Hier ist der effizienteste Weg, um dieses Problem zu lösen: Verwenden Sie die delegate-Methode willDisplayCell (dies berücksichtigt auch die weiße Farbe für den Hintergrund der Textbeschriftung, wenn Sie cell.textLabel.text und / oder cell.detailTextLabel.text verwenden ):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Wenn diese Delegatmethode aufgerufen wird, wird die Farbe der Zelle über die Zelle und nicht über die Tabellenansicht gesteuert, wie bei Verwendung von:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... }

Fügen Sie also im Hauptteil der Zelldelegatenmethode den folgenden Code hinzu, um die Farben der Zellen zu ändern, oder verwenden Sie einfach den Funktionsaufruf, um alle Zellen der Tabelle auf dieselbe Farbe zu bringen.

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];

Diese Lösung hat unter meinen Umständen gut funktioniert ...

Nathan B.
quelle
Dies ist eine viel sauberere Lösung. Die meisten anderen Lösungen erfordern entweder eine Unterklasse der UITableViewCell. Die Lösung von vlado.grigorov funktioniert bei mir nicht.
Ronnie Liew
In der Tat, und dies ist die Methode, die Apple selbst gemäß verschiedenen WWDC-Präsentationen empfiehlt, die ich gesehen habe.
Mike Weller
Schön - AUSSER wenn Sie neue Zeilen oben in der Liste hinzufügen müssen. Bei dieser Methode werden alle Zusätze gleich gefärbt. Das Aktualisieren behebt das Problem, benötigt jedoch unnötige Zeit. Gestern herausgefunden ...
JOM
Dies scheint gut zu funktionieren, außer bei Verwendung von Core Data. Neue Zellen, die über einen NSFetchedResultsController hinzugefügt wurden, scheinen willDisplayCell nicht richtig aufzurufen. Ich bin ratlos, damit es funktioniert ...
Radven
Die entsprechende Zeile zum Festlegen der Hintergrundfarbe in Swift 2.0:cell.backgroundColor = UIColor.clearColor
kbpontius
104

Dies ist wirklich einfach, da OS 3.0 nur die Hintergrundfarbe der Zelle in der willDisplayCell-Methode festlegt. Sie dürfen die Farbe nicht im cellForRowAtIndexPath festlegen.

Dies funktioniert sowohl für den einfachen als auch für den gruppierten Stil:

Code:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor redColor];
}

PS: Hier der Dokumentationsextrakt für willDisplayCell:

"Eine Tabellenansicht sendet diese Nachricht an ihren Delegaten, kurz bevor sie eine Zelle zum Zeichnen einer Zeile verwendet, wodurch der Delegierte das Zellenobjekt anpassen kann, bevor es angezeigt wird. Diese Methode gibt dem Delegaten die Möglichkeit, zuvor festgelegte zustandsbasierte Eigenschaften zu überschreiben die Tabellenansicht, z. B. Auswahl und Hintergrundfarbe. Nachdem der Delegat zurückgekehrt ist, legt die Tabellenansicht nur die Alpha- und Rahmeneigenschaften fest und dann nur, wenn Zeilen beim Ein- oder Ausschieben animiert werden. "

Ich habe diese Informationen in diesem Beitrag von colionel gefunden . Danke ihm!

Seba
quelle
3
Dies sollte als die richtige Antwort markiert werden, da Sie nicht einmal etwas
tun
1
Dies funktioniert nicht, wenn Sie für mich eine andere Zellenhintergrundfarbe als den Hintergrund der Tabellenansichten wünschen.
Chris
Für Gruppenzellen können Sie es auf cellForRow
Sharen Eayrs
58

Der beste Ansatz, den ich bisher gefunden habe, besteht darin, eine Hintergrundansicht der Zelle und einen klaren Hintergrund für die Unteransichten der Zellen festzulegen. Natürlich sieht dies nur auf Tischen mit indiziertem Stil gut aus, egal mit oder ohne Zubehör.

Hier ist ein Beispiel, bei dem der Hintergrund der Zelle gelb ist:

UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
backgroundView.backgroundColor = [ UIColor yellowColor ];
cell.backgroundView = backgroundView;
for ( UIView* view in cell.contentView.subviews ) 
{
    view.backgroundColor = [ UIColor clearColor ];
}
Vladimir Grigorov
quelle
1
Wenn Sie dies tun, stellen Sie sicher, dass die undurchsichtige Eigenschaft ebenfalls auf NO gesetzt ist.
Lily Ballard
11
Die Verwendung transparenter Zellkontrollen wird wirklich nicht empfohlen. Die Bildlaufleistung wird stark beeinträchtigt, weshalb Apple immer sagt, dass undurchsichtige Steuerelemente verwendet werden sollen.
Mike Weller
3
Unter iOS 4.2 und höher scheint die Schleife nicht mehr erforderlich zu sein.
Frank Schmitt
Sehr schön. Funktioniert perfekt bei Verwendung von Zubehöransichten !!
RyanG
19

Fügen Sie dies einfach in Ihre UITableView-Delegatklassendatei (.m) ein:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
    cell.backgroundColor = color;
}
JAG
quelle
7

Ich stimme Seba zu. Ich habe versucht, meine abwechselnde Zeilenfarbe in der delegierten Methode rowForIndexPath festzulegen, habe jedoch inkonsistente Ergebnisse zwischen 3.2 und 4.2 erhalten. Das Folgende hat für mich großartig funktioniert.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ((indexPath.row % 2) == 1) {
        cell.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

}
Chiffrez
quelle
1
Ich verstehe immer noch nicht, warum das Festlegen in willDisplayCell einen Unterschied macht. Es heißt sowieso, ob wir das umsetzen oder nicht, oder?
Sharen Eayrs
6

Nachdem Sie alle verschiedenen Lösungen ausprobiert haben, ist die folgende Methode die eleganteste. Ändern Sie die Farbe in der folgenden Delegatenmethode:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}
Jim Huang
quelle
4

vlado.grigorov hat einige gute Ratschläge - der beste Weg ist, eine Hintergrundansicht zu erstellen und dieser eine Farbe zu geben, wobei alles andere auf clearColor gesetzt wird. Ich denke auch, dass dies der einzige Weg ist, um die Farbe korrekt zu löschen (probieren Sie sein Beispiel aus - aber setzen Sie 'clearColor' anstelle von 'yellowColor'), was ich versucht habe.

William Denniss
quelle
Ein Vorteil dieses Ansatzes besteht darin, dass Sie die Farbe in Interface Builder als Entwurfszeit-Eigenschaft beibehalten können. Ein Designproblem weniger, das Entwicklerinteraktion erfordert.
Whitneyland
1
cell.backgroundView = [[[UIView alloc] initWithFrame: cell.bounds] autorelease]; cell.backgroundView.backgroundColor = [UIColor redColor];
Brian
3

Das Anpassen des Hintergrunds einer Tabellenansichtszelle wird schließlich zu einem "Alles oder Nichts" -Ansatz. Es ist sehr schwierig, die Farbe oder das Bild für den Hintergrund einer Inhaltszelle so zu ändern, dass sie nicht seltsam aussehen.

Der Grund ist, dass die Zelle tatsächlich die Breite der Ansicht überspannt. Die abgerundeten Ecken sind nur ein Teil des Zeichenstils, und die Inhaltsansicht befindet sich in diesem Bereich.

Wenn Sie die Farbe der Inhaltszelle ändern, werden an den Ecken weiße Stellen angezeigt. Wenn Sie die Farbe der gesamten Zelle ändern, wird ein Farbblock über die Breite der Ansicht angezeigt.

Sie können eine Zelle definitiv anpassen, aber es ist nicht ganz so einfach, wie Sie zunächst vielleicht denken.

Andrew Grant
quelle
1
Dies gilt definitiv für Zellen in gruppierten Tabellen, aber einfache Tabellen müssen sich nicht so viele Sorgen machen. Eine schmucklose Zelle ohne Zubehör sollte gut aussehen.
Ben Gottlieb
Ben - guter Punkt. Ich verwende hauptsächlich gruppierte Tabellen, aber wie Sie bereits erwähnt haben, leiden einfache Tabellen nicht unter diesen Problemen.
Andrew Grant
3

Erstellen Sie eine Ansicht und legen Sie diese als Hintergrundansicht der Zelle fest

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];
Senthil
quelle
3

So erweitern Sie die Antwort von N.Berendt: Wenn Sie die Zellenfarbe basierend auf einem bestimmten Status im tatsächlichen Zellendatenobjekt festlegen möchten, konfigurieren Sie zu dem Zeitpunkt den Rest der Informationen für die Tabellenzelle, was normalerweise der Fall ist, wenn Sie sich in der befinden Mit der cellForRowAtIndexPath-Methode können Sie dies tun, indem Sie die willDisplayCell-Methode überschreiben, um die Hintergrundfarbe der Zelle aus der Hintergrundfarbe der Inhaltsansicht festzulegen. Dadurch wird das Problem umgangen, dass die Hintergründe der Offenlegungsschaltflächen usw. nicht richtig sind, Sie können jedoch die Farbe in der cellForRowAtIndexPath-Methode steuern Hier führen Sie alle anderen Zellenanpassungen durch.

Also: Wenn Sie diese Methode Ihrem Tabellenansicht-Delegaten hinzufügen:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
}

Dann können Sie in Ihrer cellForRowAtIndexPath-Methode Folgendes tun:

if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
}

Dies erspart Ihnen das erneute Abrufen Ihrer Datenobjekte in der willDisplayCell-Methode und spart außerdem zwei Stellen, an denen Sie Ihre Tabellenzelle anpassen / anpassen können. Alle Anpassungen können in der cellForRowAtIndexPath-Methode erfolgen.

gamozzii
quelle
3

Erstellen Sie ein Bild als Hintergrund mit Photoshop oder Gimp und nennen Sie es myimage. Fügen Sie diese Methode dann Ihrer tableViewController-Klasse hinzu:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with  gradient  color created with gimp
    UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage];
    cellView.contentMode = UIContentViewModeScaleToFill;
    cell.backgroundView = cellView;
    //set the background label to clear
    cell.titleLabel.backgroundColor= [UIColor clearColor];
}

Dies funktioniert auch, wenn Sie UITableView im Attributinspektor auf "Benutzerdefiniert" gesetzt haben.

Davide
quelle
2

Meine Lösung besteht darin, dem cellForRowAtIndexPath-Ereignis den folgenden Code hinzuzufügen:

UIView *solidColor = [cell viewWithTag:100];
if (!solidColor) {

    solidColor = [[UIView alloc] initWithFrame:cell.bounds];
    solidColor.tag = 100; //Big tag to access the view afterwards
    [cell addSubview:solidColor];
    [cell sendSubviewToBack:solidColor];
    [solidColor release];
}
solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0
                                             green:233.0/255.0
                                              blue:233.0/255.0
                                             alpha:1.0];

Funktioniert unter allen Umständen, auch mit Offenlegungsschaltflächen, und es ist besser, wenn Ihre Logik auf den Farbstatus von Zellen in cellForRowAtIndexPath einwirkt als auf das Ereignis cellWillShow, denke ich.

albertoFlagSolutions
quelle
1

Unterklasse UITableViewCell und füge dies in die Implementierung ein:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
JonahGabriel
quelle
1
    UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
    bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1]; 
    cell.backgroundView = bg;
    [bg release];
Bhavesh Nayi
quelle
1

Dies funktioniert im neuesten Xcode.

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}
Sameera R.
quelle
0

Versuche dies:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
Stich
quelle