UITableViewCell mostra lo sfondo bianco e non può essere modificato su iOS7


186

Ho implementato una classe di celle di visualizzazione tabella personalizzata che eredita da UITableViewCell. La vista tabella contiene un'immagine di sfondo, quindi voglio che lo sfondo della cella sia trasparente. Sembra fantastico prima di iOS7.

Tuttavia, in iOS7, la cella viene sempre mostrata con uno sfondo bianco.


Anche per Xcode7, 2015, nello storyboard è presente un bug : devi impostare il colore di sfondo di una cella nel codice.


puoi cambiare direttamente il colore di sfondo della cella accedendo al colore di sfondo della sua proprietà. cell.backgroundColor = [UIColor clearColor];
ViruMax,

Risposte:


384

Come diceva Apple DOC ( riferimento alla classe UITableViewCell ):

... In iOS 7, le celle hanno uno sfondo bianco per impostazione predefinita ; nelle versioni precedenti di iOS, le celle ereditano il colore di sfondo della vista tabella allegata. Se si desidera modificare il colore di sfondo di una cella, farlo in tableView: willDisplayCell: forRowAtIndexPath: metodo del delegato della vista tabella.

Quindi, nel mio caso, per mostrare celle con sfondo trasparente, è sufficiente implementare il metodo delegato nel controller della vista tabella come di seguito:

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

Solo nota : come ha detto @null, "... sembra che ci sia un bug nel generatore di interfacce ..." , non sono del tutto sicuro che abbia il bug, ma sembra così perché il suo commento ha ottenuto diversi voti. Quindi potrebbe esserci qualcosa di sbagliato se usi IB. :)


53
Sfortunatamente non è vero, sembra che ci sia un bug nel generatore di interfacce e non sono riuscito a impostarlo sulla mia cella personalizzata dallo storyboard.
Tarek Hallak,

1
@null, aha, sembra che iOS 7 SDK abbia ancora molti bug da correggere. Ne ho già incontrati alcuni, ma per quanto riguarda Storyboard, non ne ho idea. :)
Kjuly,

4
Puoi anche farlo nel tableView:cellForRowAtIndexPath:metodo.
bugloaf

1
@KendallHelmstetterGelner sei sicuro? Non l'ho ancora notato, sembra ancora funzionare per me. :)
Kjuly

1
Come dice bugloaf sopra - fallo in tableView: cellForRowAtIndexPath:
amergin

66

L'ho studiato un po 'e ho scoperto che la cella backgroundColor è impostata dal sistema Aspetto. Quindi, se tutte le celle dell'applicazione hanno uno sfondo chiaro, la soluzione più semplice sarebbe:

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

E anche se hanno uno sfondo diverso, il colore chiaro sembra essere il più conveniente come quello predefinito.


1
Tu amico mio sei un mostro. Eseguo la sottoclasse di tutti i miei messaggi UITableViewCell, quindi non è stato un problema fornire una superclasse con un inizializzatore per impostare il colore BG clearColor, ma indovinate un po '? Non ha funzionato ... Voglio dire, PERCHÉ MELA?
Mazyod,

Questo funziona Tuttavia, il colore bianco appare fuori dalla vista. È andato con la massima risposta per il miglior effetto (senza scoppiettii).
Carl Prehn,

@Anton Filimonov Ho impostato l'aspetto della cella della vista tabella nel mio Appdelegate ora in una vista particolareController Voglio avere un colore diverso per la cella Come posso affrontare questo scenario? Ho provato a impostare un colore diverso nel metodo delegato CellWillDisplay ma nessun effetto. Potresti per favore aiutarmi in questo
Peer Mohamed Thabib,

@PeerMohamedThabib, per favore, dacci qualcosa in più sull'ambiente (iPad / iPhone, versione iOS) e fornisci del codice. E in realtà puoi investigare tu stesso la situazione - basta creare una sottoclasse di UITableViewCell, ridefinire il metodo setBackgroundColor: (basta chiamare l'implementazione della superclasse all'interno) e mettere un punto di interruzione in questo metodo e vedrai, cosa cambia il colore delle celle dopo averlo impostato all'interno della tabella Visualizza: willDisplayCellAtIndexPath:
Anton Filimonov,

1
Anche se hai celle miste, alcune con sfondo e altre senza (trasparente). Il modo più semplice è definire una classe personalizzata e scrivere lo stesso codice. In questo modo tutte le classi UITableViewCell rimarranno predefinite e le classi personalizzate avranno un colore chiaro. [[Aspetto CustomTableCell] setBackgroundColor: [UIColor clearColor]]; Ciò non influisce sul UITableViewCells predefinito e influisce solo sulle celle personalizzate.
Ansari,

30

Scrivi questo nel tuo metodo cellForRowAtIndexPath prima di restituire la cella;

cell.backgroundColor = [UIColor clearColor];

1
Questo mi ha aiutato con un problema su iOS 8 su iPhone 5.
Almo,

13

Il colore di sfondo predefinito di un UITableViewCellin iOS 7 è bianco.

Devi impostare la backgroundColorproprietà da qualche parte nel tuo codice. Ad esempio, impostalo dopo aver appena creato la cella.

cell.backgroundColor = [UIColor clearColor];

Ho provato ma non ha funzionato per me. Sei sicuro che funzioni?
Matrosov Alexander,

Funziona per me per una cella di visualizzazione tabella personalizzata nel metodo initWithCoder: aDecoder.
ftvs

13

In realtà ho scoperto che il problema è nato dal colore di sfondo di UITableView che non veniva impostato per cancellare. Se modifichi il colore di sfondo di UITableViewCell in modo da renderlo chiaro e ti accorgi che vedi ancora bianco, assicurati che il colore di sfondo di UITableView sia impostato su Clear (o qualsiasi cosa tu voglia).

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

In Swift

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()

Solo FYI puoi anche impostare questo in IB. Assicurati solo di cambiare il colore di sfondo nella sezione 'Visualizza' e non solo la sezione 'Vista tabella' che apparentemente non ha alcun effetto evidente.
AndyDunn,

1
questo ha funzionato anche per me, stavo cercando la versione rapida di esso. Aggiunto ciò che ha funzionato per me nel codice :)
Mugunthan Balakrishnan,

10

Questo è sicuramente un bug iOS. In iOS 8, l'impostazione del colore di sfondo Interface Builderfunziona bene per iPhone, ma in iPad è sempre whiteColor. Per risolverlo, nel cellForIndexPathmessaggio dell'origine dati, inserendo questo:

cell.backgroundColor = cell.backgroundColor

E funzionerà. Questo è esattamente il motivo per cui ho detto che è un bug dal momento che il codice stesso è praticamente una cazzata, ma funziona.


Ancora il caso di Xcode7 / iOS9. Ho aggiunto il codice esplicito in tableView: willDisplayCell: forRowAtIndexPath come suggerito sopra.
Andrew Duncan,

In XCode 7.0.1 l'app universale di compilazione mostrava uno sfondo nero su iPhone con iOS 7,8,9 ma uno sfondo bianco su iPad con iOS 9.0.2 (e probabilmente altri, ma non è possibile verificarlo). Il codice sopra lo ha riparato.
ScottyB,

Per l'override di TableView statico willDisplayCell con cell.backgroundColor = UIColor.clearColor (). La riassegnazione della configurazione del colore in IB non ha funzionato per me.
Viktor Kucera il

4

È possibile che UITableViewCell sia selezionato per impostazione predefinita. Puoi confermarlo utilizzando il nuovo debugger visivo di Xcode 6s (o scoprire esattamente quale vista sta facendo apparire questo globulo bianco).

inserisci qui la descrizione dell'immagine

È interessante notare che, dopo aver conosciuto questo .. impostare il colore della cella selezionata sfondo per cancellare ancora non ha funzionato .. facendo qualche ricerca, scopre ho dovuto modificare lo stile di selezione quando sto creando questa cella personalizzato:

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

collegamento interrotto per visual debugger
Suragch

3

Ho scoperto che nessuna delle precedenti ha funzionato da XCode 5.1.1, iOS 7.1.

Se si utilizza Interface Builder con celle prototipo, selezionare la cella prototipo, quindi dal selettore degli attributi nella sezione Visualizza, modificare l'impostazione predefinita del modulo Sfondo su Cancella colore:

inserisci qui la descrizione dell'immagine

Questo sembra funzionare bene. Nessuna delle modifiche al codice sopra riportate è necessaria, questa è una soluzione IB pura.


2

La risposta accettata non ha risolto il problema per me. Ho dovuto fare questo:

  1. Nel generatore di interfaccia, selezionare la vista tabella. Quindi dalla finestra di ispezione degli attributi, dalla sezione Visualizza , imposta lo Sfondo su trasparente (opacità 0%).

inserisci qui la descrizione dell'immagine

  1. Dal metodo cellForRowAtIndexPath dell'origine dati della tabella:

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent

Bene, usi Interface Builder .. come ha commentato @null sotto la mia risposta, "... sembra esserci un bug nel generatore di interfacce ..." , non sono del tutto sicuro che abbia il bug, ma sembra che il commento ha ottenuto diversi voti. ;)
Kjuly

Qualcosa in iOS7 è sicuramente difettoso quando si tratta di sfondo cellulare trasparente. Spero che la mia risposta aiuti gli altri che si trovano ad affrontare una situazione simile alla mia.
RajV,

Questo non è il modo giusto per creare celle per la vista della tabella, specialmente se stai usando Interface Builder / Storyboard. Nello snippet di codice stai creando una nuova cella ogni volta che il delegato ne richiede uno, questo non viene riutilizzato! Per ottenere i vantaggi in termini di prestazioni del riutilizzo delle celle, è necessario utilizzare cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. Nelle versioni precedenti rilasciate l'argomento indexPath e quindi verificate la presenza di zero, creando un'istanza con lo initWithStyle:reuseIdentifiersnippet di codice nel caso zero.
ikuramedia,

ikuramedia: ho lasciato il codice di riutilizzo fuori dal mio post. Certo, riutilizzo le cellule. Non è questo il punto di questo post.
RajV,

2

Per me l'impostazione cell.backgroundColor = cell.contentView.backgroundColor; sia in tableView:willDisplayCell:forRowAtIndexPath:o tableView:cell:forRowAtIndexPath:ha fatto il lavoro.

Questo perché ho impostato il colore di sfondo di contentView in Interface Builder come desiderato.


1

Quando si aggiungono oggetti dell'interfaccia utente a una cella, Xcode 5 / IOS 7 aggiunge una nuova "Visualizzazione contenuto" che sarà la superview di tutti gli elementi nella cella. Per impostare il colore di sfondo della cella, imposta il colore di sfondo di questa vista contenuto. Le soluzioni sopra non hanno funzionato per me, ma questa ha funzionato bene per me.


La vista del contenuto è disponibile anche nelle precedenti versioni dell'SDK, è sufficiente impostare un colore di sfondo per la vista del contenuto che copre la vista di sfondo della cella.
Kjuly,

Bene, non si apre automaticamente nel builder di interfacce precedente a xcode 5. Qual è esattamente il tuo punto?
DrBug,

Voglio dire, la tua risposta ha discusso per un altro problema, non per la mia domanda. Vuoi solo impostare un colore di sfondo per la tua cella, giusto? Quindi, indipendentemente dal fatto che le celle abbiano uno sfondo bianco per impostazione predefinita o meno in iOS 7, puoi sempre implementarlo impostando un colore per la vista del contenuto, poiché la vista del contenuto si trova sulla vista di sfondo della cella. Ha senso? ;)
Kjuly,

1

Soluzione Swift 1.2:

Aggiungi una definizione esplicita per il colore di sfondo della tua cella in questo modo:

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

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

    return cell
}

Scusate. È mia cattiva. Funziona. Ho perso alcune altre impostazioni.
Sung Kim

1

Ha avuto un problema simile, ha dovuto

  1. Imposta blu come selectionStyle e
  2. aggiungilo al codice per correggerlo

    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
    }

0

Puoi anche usare il codice colore per rendere redditizia la tua cella UITableView.

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

Questo è il codice per applicare il metodo del codice colore:

-(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];
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.