it-swarm.com.de

Wie kann ich die Hintergrundfarbe einer UITableViewCell anpassen?

Ich möchte den Hintergrund (und möglicherweise auch den Rand) aller UITableViewCells in meinem UITableView anpassen. Bisher konnte ich dieses Zeug 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?

186
jpm

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

191
Ben Gottlieb

Hier ist der effizienteste Weg, wie ich dieses Problem lösen kann: Verwenden Sie die willDisplayCell-Delegate-Methode (dies berücksichtigt auch die weiße Farbe des Hintergrunds 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 innerhalb des Hauptteils der Zellendelegierungsmethode den folgenden Code hinzu, um die Farben der Zellen zu ändern, oder verwenden Sie einfach den Funktionsaufruf, um alle Zellen der Tabelle mit derselben Farbe zu versehen.

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

205
N.Berendt

Dies ist sehr einfach, da OS 3.0 nur die Hintergrundfarbe der Zelle in der willDisplayCell-Methode festlegt. Sie dürfen die Farbe nicht in 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];
}

P.S: Hier der Dokumentationsextrakt für willDisplayCell:

"Eine Tabellenansicht sendet diese Nachricht an ihren Stellvertreter, kurz bevor sie Zelle zum Zeichnen einer Zeile verwendet, wodurch der Stellvertreter das Zellenobjekt anpassen kann, bevor es angezeigt wird. Diese Methode gibt dem Stellvertreter die Möglichkeit, zuvor von festgelegte zustandsbasierte Eigenschaften zu überschreiben die Tabellenansicht, z. B. Auswahl und Hintergrundfarbe. Nachdem der Delegat zurückgekehrt ist, werden in der Tabellenansicht nur die Alpha - und Rahmeneigenschaften festgelegt.

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

104
Seba

Der beste Ansatz, den ich bisher gefunden habe, besteht darin, eine Hintergrundansicht der Zelle und einen klaren Hintergrund für Zellteilansichten festzulegen. Natürlich sieht das auf Tischen mit Index nur gut aus, egal ob mit oder ohne Zubehör.

Hier ist ein Beispiel, in dem der Hintergrund der Zelle gelb gefärbt 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 ];
}
58

Fügen Sie dies einfach in Ihre UITableView-Delegate-Klassendatei (.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;
}
19
JAG

Ich stimme Seba zu, ich habe versucht, meine abwechselnde Zeilenfarbe in der rowForIndexPath-Delegatmethode festzulegen, aber es wurden inkonsistente Ergebnisse zwischen 3.2 und 4.2 erzielt. Folgendes 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;
    }

}
7
cipherz

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

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

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, die Farbe korrekt zu löschen (probieren Sie sein Beispiel aus - aber stellen Sie 'clearColor' anstelle von 'yellowColor' ein), was ich versucht habe.

4
William Denniss

Das Anpassen des Hintergrunds einer Tabellenzelle 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 es nicht merkwürdig aussieht.

Der Grund ist, dass sich die Zelle tatsächlich über die Breite der Ansicht erstreckt. 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 weiße Teile an den Ecken sichtbar. 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 vielleicht zuerst denken.

3
Andrew Grant

So erweitern Sie die Antwort von N.Berendt: Wenn Sie die Zellenfarbe basierend auf einem Status im eigentlichen Zellendatenobjekt festlegen möchten, konfigurieren Sie zum Zeitpunkt der Konfiguration den Rest der Informationen für die Tabellenzelle. Dies ist normalerweise der Fall, wenn Sie sich in der befinden cellForRowAtIndexPath-Methode. Sie können dies tun, indem Sie die willDisplayCell-Methode überschreiben, um die Hintergrundfarbe der Zelle anhand der Hintergrundfarbe der Inhaltsansicht festzulegen. Dadurch wird das Problem umgangen, dass die Hintergründe der Schaltfläche für die Offenlegung usw. nicht richtig sind, aber Sie können dennoch die Farbe in der cellForRowAtIndexPath-Methode steuern wo Sie all Ihre anderen Zellanpassungen vornehmen.

Also: Wenn Sie diese Methode zu Ihrem Tabellendelegaten 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 das erneute Abrufen Ihrer Datenobjekte in der willDisplayCell-Methode sowie das Anpassen/Anpassen Ihrer Tabellenzelle an zwei Stellen - alle Anpassungen können in der cellForRowAtIndexPath-Methode vorgenommen werden.

3
gamozzii

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];
3
Senthil

Erstellen Sie ein Bild, das als Hintergrund für Photoshop oder Gimp verwendet werden soll, und nennen Sie es myimage. Fügen Sie dann Ihrer tableViewController-Klasse diese Methode 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 eingestellt haben.

3
Davide

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 keinen Umständen, auch nicht mit Offenlegungsschaltflächen, und es ist meiner Meinung nach besser, wenn Ihre Logik auf den Farbstatus der Zellen in cellForRowAtIndexPath einwirkt als auf das cellWillShow-Ereignis.

Dies funktioniert im neuesten Xcode.

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}
1
Sameera R.
    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];
1
Bhavesh Nayi

Unterklasse UITableViewCell und füge dies in der Implementierung hinzu:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
1
JonahGabriel

Versuche dies:

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