Cómo personalizar el color de fondo de una UITableViewCell?


Me gustaría personalizar el fondo (y tal vez el borde también) de todas las células UITableViewCells dentro de mi UITableView. Hasta ahora no he sido capaz de personalizar estas cosas, así que tengo un montón de celdas de fondo blanco que es el predeterminado.

¿Hay alguna manera de hacer esto con el SDK de iPhone?

Author: Ryan Townshend, 2008-11-11

17 answers

Debe establecer el color de fondo del contentView de la celda a su color. Si usas accesorios (como flechas de divulgación, etc.), aparecerán en blanco, por lo que es posible que tengas que rodar versiones personalizadas de ellos.

 187
Author: Ben Gottlieb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-11 18:13:50

Aquí está la forma más eficiente que he encontrado para resolver este problema, use el método willDisplayCell delegate (esto se encarga del color blanco para el fondo de la etiqueta de texto también cuando se usa cell.textLabel.texto y / o celda.detailTextLabel.texto):

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

Cuando se llama a este método delegado, el color de la celda se controla a través de la celda en lugar de la vista de tabla, como cuando se usa:

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

Así que dentro del cuerpo del método delegado de celda agregue el siguiente código a alterne los colores de las celdas o simplemente use la llamada a la función para hacer que todas las celdas de la tabla tengan el mismo color.

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

Esta solución funcionó bien en mis circunstancias...

 204
Author: N.Berendt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-23 08:59:52

Esto es realmente simple, ya que OS 3.0 solo establece el color de fondo de la celda en el método willDisplayCell. No debe establecer el color en la cellForRowAtIndexPath.

Esto funciona tanto para el estilo simple como para el agrupado:

Código:

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

P. S: Aquí el extracto de documentación para willDisplayCell:

" Una vista de tabla envía este mensaje a su delegado justo antes de usar cell para dibujar una fila, lo que permite la delegar para personalizar la celda objeto antes de que se muestre. Este método le da al delegado la oportunidad de invalidar el conjunto de propiedades basadas en estados anterior por la vista de tabla, como selección y color de fondo. Despues el delegado devuelve la vista de tabla establece solo el alfa y el marco propiedades, y solo cuando animar filas mientras se deslizan o fuera."

He encontrado esta información en este post de colionel. ¡Agradécele!

 104
Author: Seba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-10 13:57:15

El mejor enfoque que he encontrado hasta ahora es establecer una vista de fondo de la celda y borrar el fondo de las subviews de la celda. Por supuesto, esto se ve bien en mesas con estilo indexado solamente, sin importar con o sin accesorios.

Aquí hay una muestra donde el fondo de la celda es amarillo:

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 ];
}
 57
Author: Vladimir Grigorov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-14 14:57:57

Simplemente ponga esto en su archivo de clase delegada 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;
}
 19
Author: JAG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-27 11:19:39

Estoy de acuerdo con Seba, Traté de establecer mi color de fila alterna en el método de delegado rowForIndexPath, pero estaba obteniendo resultados inconsistentes entre 3.2 y 4.2. Lo siguiente funcionó muy bien para mí.

- (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
Author: cipherz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-23 19:29:40

Después de probar todas las soluciones diferentes, el siguiente método es el más elegante. Cambie el color en el siguiente método delegado:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}
 6
Author: Jim Huang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-08 09:43:24

Vlado.grigorov tiene algunos buenos consejos - la mejor manera es crear un backgroundView, y darle un color, estableciendo todo lo demás al clearColor. Además, creo que esa es la única manera de limpiar correctamente el color (pruebe su muestra, pero establezca 'clearColor' en lugar de 'yellowColor'), que es lo que estaba tratando de hacer.

 4
Author: William Denniss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-04 06:10:13

La personalización del fondo de una celda de vista de tabla eventualmente se convierte en un enfoque de "todo o nada". Es muy difícil cambiar el color o la imagen utilizada para el fondo de una celda de contenido de una manera que no se vea extraña.

La razón es que la celda realmente abarca el ancho de la vista. Las esquinas redondeadas son solo parte de su estilo de dibujo y la vista de contenido se encuentra en esta área.

Si cambia el color de la celda de contenido, terminará con bits blancos visibles en las esquinas. Si cambia el color de toda la celda, tendrá un bloque de color que abarca el ancho de la vista.

Definitivamente puede personalizar una celda, pero no es tan fácil como puede pensar al principio.

 3
Author: Andrew Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-11 21:32:17

Cree una vista y establézcala como vista de fondo de la celda

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];
 3
Author: Senthil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-28 10:32:34

Para ampliar la respuesta de N. Berendt: Si desea establecer el color de la celda en función de algún estado en el objeto de datos de celda real, en el momento en que está configurando el resto de la información para la celda de la tabla, que es típicamente cuando está en el método cellForRowAtIndexPath, puede hacer esto anulando el método willDisplayCell para establecer el color de fondo de la celda desde el color de fondo de la vista de contenido: esto evita el problema de los fondos del botón de divulgación, etc. no estar en lo cierto, pero aún así le permite controlar el color en el método cellForRowAtIndexPath donde está haciendo todas sus otras personalizaciones de celdas.

So: Si agrega este método a su delegado de vista de tabla:

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

Luego en su método cellForRowAtIndexPath puede hacer:

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

Esto ahorra tener que recuperar sus objetos de datos de nuevo en el método willDisplayCell y también ahorra tener dos lugares donde hacer la adaptación / personalización de la celda de la tabla - toda la personalización puede ir en el Método cellForRowAtIndexPath.

 3
Author: gamozzii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-02 01:08:11

Cree una imagen para usarla como fondo con Photoshop o gimp y llámela myimage. Luego, agregue este método a su clase 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];
}

Esto también funcionará si ha establecido UITableView en custom in attribute inspector.

 3
Author: Davide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-11 07:35:26

Mi solución es agregar el siguiente código al 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 bajo cualquier circunstancia, incluso con botones de divulgación, y es mejor para su lógica actuar sobre el estado de color de las celdas en cellForRowAtIndexPath que en cellWillShow event creo.

 2
Author: albertoFlagSolutions,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-11 07:34:03

Subclase UITableViewCell y agregue esto en la implementación:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
 1
Author: JonahGabriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-06 21:32:56
    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
Author: Bhavesh Nayi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-04 08:55:05

Esto funcionará en el último Xcode.

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}
 1
Author: Sameera R.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-11 07:33:06

Prueba esto:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
 0
Author: Pang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-10 03:01:26