Domanda

Vorrei personalizzare lo sfondo (e forse anche il bordo) di tutti gli UITableViewCells all'interno del mio UITableView. Finora non sono stato in grado di personalizzare queste cose, quindi ho un sacco di celle con sfondo bianco che è l'impostazione predefinita.

C'è un modo per farlo con l'SDK di iPhone?

È stato utile?

Soluzione

Devi impostare il colore di sfondo del contenuto della cella Visualizza sul tuo colore. Se utilizzi accessori (come frecce di apertura, ecc.), Verranno visualizzati in bianco, quindi potresti dover eseguire il roll delle versioni personalizzate di tali.

Altri suggerimenti

Ecco il modo più efficiente in cui mi sono imbattuto per risolvere questo problema, utilizzare il metodo delegato willDisplayCell (questo si occupa del colore bianco per lo sfondo dell'etichetta di testo e quando si utilizza cell.textLabel.text e / o cell. detailTextLabel.text):

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

Quando questo metodo delegato viene chiamato, il colore della cella viene controllato tramite la cella anziché tramite la vista tabella, come quando si utilizza:

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

Quindi nel corpo del metodo del delegato di cella aggiungi il seguente codice per alternare i colori delle celle o usa semplicemente la chiamata di funzione per rendere tutte le celle della tabella dello stesso colore.

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

Questa soluzione ha funzionato bene nelle mie circostanze ...

Questo è davvero semplice, dal momento che OS 3.0 ha appena impostato il colore di sfondo della cella nel metodo willDisplayCell. Non devi impostare il colore in cellForRowAtIndexPath.

Funziona sia per lo stile semplice che per quello raggruppato:

Codice:

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

P.S: qui l'estratto della documentazione per willDisplayCell:

  

" Una vista tabella invia questo messaggio a   il suo delegato appena prima di usare la cella   disegnare una riga, permettendo così il   delegare per personalizzare l'oggetto cella   prima che venga visualizzato. Questo metodo   dà al delegato la possibilità di   sovrascrive il set di proprietà basato sullo stato   precedentemente dalla vista tabella, come ad esempio   selezione e colore di sfondo. Dopo   il delegato ritorna, la vista tabella   imposta solo l'alfa e il frame   proprietà e quindi solo quando   animando le righe mentre scivolano dentro o   . Out "

Ho trovato queste informazioni in questo post dal colionel . Grazie!

L'approccio migliore che ho trovato finora è impostare una vista di sfondo della cella e cancellare lo sfondo delle sottoview delle celle. Certo, questo sembra bello solo su tavoli con stile indicizzato, non importa con o senza accessori.

Ecco un esempio in cui lo sfondo della cella è giallo:

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

Metti semplicemente questo nel tuo file di classe delegato UITableView (.m):

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

Concordo con Seba,    Ho provato a impostare il mio colore di riga alternato nel metodo delegato rowForIndexPath ma ottenevo risultati incoerenti tra 3.2 e 4.2. Quanto segue ha funzionato benissimo per me.

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

}

Dopo aver provato tutte le diverse soluzioni, il seguente metodo è il più elegante. Modificare il colore nel seguente metodo delegato:

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

vlado.grigorov ha dei buoni consigli: il modo migliore è creare un backgroundView e dargli un colore, impostando tutto il resto su clearColor. Inoltre, penso che sia l'unico modo per cancellare correttamente il colore (prova il suo campione - ma imposta 'clearColor' invece di 'yellowColor'), che è quello che stavo cercando di fare.

La personalizzazione dello sfondo di una cella della vista tabella alla fine diventa e " tutto o niente " approccio. È molto difficile cambiare il colore o l'immagine utilizzati per lo sfondo di una cella di contenuto in un modo che non sembra strano.

Il motivo è che la cella si estende effettivamente sulla larghezza della vista. Gli angoli arrotondati fanno solo parte del suo stile di disegno e la vista del contenuto si trova in quest'area.

Se cambi il colore della cella del contenuto, finirai con dei bit bianchi visibili agli angoli. Se cambi il colore dell'intera cella, avrai un blocco di colore che copre la larghezza della vista.

Puoi sicuramente personalizzare una cella, ma non è così facile come potresti pensare all'inizio.

Crea una vista e impostala come vista di sfondo della cella

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

Per estendere la risposta di N.Berendt: se si desidera impostare il colore della cella in base a uno stato nell'oggetto dati cella effettivo, nel momento in cui si stanno configurando il resto delle informazioni per la cella della tabella, che è in genere quando si sono nel metodo cellForRowAtIndexPath, puoi farlo sovrascrivendo il metodo willDisplayCell per impostare il colore di sfondo della cella dal colore di sfondo della vista contenuto - questo risolve il problema degli sfondi dei pulsanti di divulgazione, ecc., non avendo ragione, ma ti consente comunque di controllare il colore il metodo cellForRowAtIndexPath in cui stai eseguendo tutte le altre personalizzazioni delle celle.

Quindi: Se aggiungi questo metodo al delegato della visualizzazione tabella:

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

Quindi nel tuo metodo cellForRowAtIndexPath puoi fare:

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

Questo evita di dover recuperare nuovamente i tuoi oggetti dati nel metodo willDisplayCell e salva anche di avere due posizioni in cui esegui la personalizzazione / personalizzazione della cella della tabella: tutta la personalizzazione può andare nel metodo cellForRowAtIndexPath.

Crea un'immagine da usare come sfondo con Photoshop o gimp e chiamala myimage. Quindi, aggiungi questo metodo alla classe tableViewController:

- (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];
}

Funzionerà anche se UITableView è stato impostato su personalizzato nella finestra di ispezione degli attributi.

La mia soluzione è aggiungere il seguente codice all'evento cellForRowAtIndexPath:

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

Funziona in qualsiasi circostanza, anche con i pulsanti di divulgazione, ed è meglio che la tua logica agisca sullo stato del colore delle celle in cellForRowAtIndexPath che nell'evento cellWillShow penso.

Sottoclasse UITableViewCell e aggiungilo nell'implementazione:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
    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];

Funzionerà con l'ultimo Xcode.

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

Prova questo:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top