Como personalizar a cor de fundo de um UITableViewCell?

Eu gostaria de personalizar o plano de fundo (e talvez a borda também) de todos os UITableViewCells dentro do meu UITableView. Até agora eu não tenho sido capaz de personalizar essas coisas, então eu tenho um monte de células de fundo branco que é o padrão.

Existe uma maneira de fazer isso com o iPhone SDK?

Você precisa definir o backgroundColor do contentView da célula para sua cor. Se você usar acessórios (como setas de divulgação, etc.), eles aparecerão em branco, então talvez você precise distribuir versões personalizadas deles.

Aqui está a maneira mais eficiente que encontrei para resolver esse problema, use o método delegate willDisplayCell (isso também cuida da cor branca do plano de fundo do label de texto ao usar cell.textLabel.text e / ou cell.detailTextLabel.text ):

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

Quando esse método delegado é chamado, a cor da célula é controlada pela célula, e não pela visualização de tabela, como quando você usa:

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

Portanto, dentro do corpo do método delegado da célula, adicione o seguinte código para alternar as colors das células ou apenas use a chamada de function para tornar todas as células da tabela a mesma cor.

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

Esta solução funcionou bem na minha circunstância …

Isso é muito simples, já que o OS 3.0 apenas define a cor de fundo da célula no método willDisplayCell. Você não deve definir a cor no cellForRowAtIndexPath.

Isso funciona para o estilo simples e agrupado:

Código:

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

PS: Aqui o extrato de documentação para willDisplayCell:

“Uma exibição de tabela envia essa mensagem para seu delegado antes de usar a célula para desenhar uma linha, permitindo assim que o delegado personalize o object de célula antes que ele seja exibido. Esse método dá ao delegado a chance de replace as propriedades baseadas em estado definidas anteriormente por a exibição de tabela, como seleção e cor de plano de fundo.Após o delegado retorna, a exibição de tabela define apenas as propriedades de alfa e de quadro e, em seguida, somente ao animar linhas à medida que elas são inseridas ou removidas. ”

Eu encontrei esta informação neste post do colionel . Agradecê-lo!

A melhor abordagem que encontrei até agora é definir uma visão de plano de fundo da célula e um plano de fundo claro das subvisualizações de célula. Claro, isso parece bom em tabelas com apenas estilo indexado, não importando com ou sem acessórios.

Aqui está uma amostra em que o fundo da célula está amarelo:

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

Basta colocar isso em seu arquivo de class delegado 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 com Seba, tentei definir minha cor de linha alternada no método delegado rowForIndexPath, mas estava obtendo resultados inconsistentes entre 3.2 e 4.2. O seguinte funcionou muito bem para mim.

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

Depois de experimentar todas as soluções diferentes, o método a seguir é o mais elegante. Altere a cor no seguinte método delegado:

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

vlado.grigorov tem alguns bons conselhos – a melhor maneira é criar um backgroundView e dar uma cor, definindo todo o resto para o clearColor. Além disso, acho que dessa forma é a única maneira de limpar corretamente a cor (tente sua amostra – mas defina ‘clearColor’ em vez de ‘yellowColor’), que é o que eu estava tentando fazer.

Personalizar o plano de fundo de uma célula de visualização de tabela se torna uma abordagem “tudo ou nada”. É muito difícil alterar a cor ou imagem usada para o fundo de uma célula de conteúdo de uma forma que não pareça estranha.

A razão é que a célula realmente ocupa a largura da vista. Os cantos arredondados são apenas parte de seu estilo de desenho e a visualização de conteúdo fica nessa área.

Se você mudar a cor da célula de conteúdo, você acabará com os bits brancos visíveis nos cantos. Se você alterar a cor da célula inteira, você terá um bloco de cor abrangendo a largura da exibição.

Você pode definitivamente personalizar uma célula, mas não é tão fácil quanto você pode pensar no início.

Crie uma exibição e defina isso como exibição em segundo plano da célula

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

Para estender a resposta de N.Berendt – Se você deseja definir a cor da célula com base em algum estado no object de dados da célula real, no momento em que você está configurando o restante das informações da célula da tabela, que é geralmente quando você está no cellForRowAtIndexPath método, você pode fazer isso substituindo o método willDisplayCell para definir a cor do plano de fundo da cor de fundo – isso contorna a questão dos fundos do botão de divulgação, etc, não sendo certo, mas ainda permite controlar a cor no método cellForRowAtIndexPath onde você está fazendo toda a sua outra personalização de célula.

Portanto: se você adicionar esse método ao delegado de exibição de tabela:

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

Então, no seu método cellForRowAtIndexPath, você pode fazer:

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

Isso evita ter que recuperar seus objects de dados novamente no método willDisplayCell e também salva ter dois locais onde você faz a customização / customização de sua célula de tabela – toda a personalização pode ir no método cellForRowAtIndexPath.

Crie uma imagem para usar como plano de fundo com o Photoshop ou gimp e nomeie-a myimage. Em seguida, adicione este método à sua class 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]; } 

Isso funcionará também se você tiver definido o UITableView como personalizado no inspetor de atributos.

Minha solução é adicionar o seguinte código ao 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]; 

Funciona sob quaisquer circunstâncias, mesmo com botões de divulgação, e é melhor para sua lógica atuar no estado de cor das células em cellForRowAtIndexPath do que no evento cellWillShow que eu acho.

Subclass UITableViewCell e adicione isto na implementação:

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

Isso funcionará no último Xcode.

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

Tente isto:

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