Pregunta

Me gustaría personalizar el fondo (y quizás el borde también) de todos los UITableViewCells dentro de mi UITableView. Hasta ahora no he podido personalizar estas cosas, así que tengo un montón de celdas de fondo blanco, que es el valor predeterminado.

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

¿Fue útil?

Solución

Debe establecer el color de fondo del contenido de la celda en su color. Si usa accesorios (como flechas de revelación, etc.), aparecerán en blanco, por lo que es posible que tenga que pasar versiones personalizadas de ellos.

Otros consejos

Esta es la forma más eficiente que he encontrado para resolver este problema, use el método delegado willDisplayCell (esto también se encarga del color blanco para el fondo de la etiqueta de texto cuando uso cell.textLabel.text y / o cell. detailTextLabel.text):

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

Cuando este método de delegado se llama, 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 { ... }

Entonces, dentro del cuerpo del método de delegado de celda, agregue el siguiente código para alternar 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 mi circunstancia ...

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

Esto funciona tanto para el estilo plano 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 que use la celda   dibujar una fila, permitiendo así   delegar para personalizar el objeto de celda   antes de que se muestre. Este método   le da al delegado la oportunidad de   anular conjunto de propiedades basadas en estado   anteriormente por la vista de tabla, como   selección y color de fondo. Después   el delegado regresa, la vista de tabla   establece solo el alfa y el marco   propiedades, y solo cuando   animando filas a medida que se deslizan o   fuera. "

He encontrado esta información en esto publicación de colionel . ¡Gracias!

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

Aquí hay una muestra en la que el fondo de la celda está 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 ];
}

Simplemente ponga esto en su archivo de clase 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;
}

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

}

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 de delegado:

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

vlado.grigorov tiene algunos buenos consejos: la mejor manera es crear una vista de fondo y darle un color, configurando todo lo demás en clearColor. Además, creo que esa es la única forma de borrar correctamente el color (pruebe su muestra, pero establezca 'clearColor' en lugar de 'yellowColor'), que es lo que estaba tratando de hacer.

Personalizar el fondo de una celda de vista de tabla eventualmente se convierte en " todo o nada " enfoque. 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 abarcará el ancho de la vista.

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

Cree una vista y configúrela como vista de fondo de la celda

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

Para ampliar la respuesta de N.Berendt: si desea establecer el color de 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 normalmente es cuando están 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 que los fondos del botón de divulgación, etc., no sean correctos, pero aún le permiten controlar el color en el método cellForRowAtIndexPath donde está haciendo todas sus otras personalizaciones de celda.

Entonces: 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 nuevamente en el método willDisplayCell y también ahorra tener dos lugares donde se personaliza / personaliza la celda de la tabla: toda la personalización puede ir en el método cellForRowAtIndexPath.

Cree una imagen para usar como fondo con Photoshop o gimp y asígnele el nombre 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 funcionará también si ha configurado UITableView como personalizado en el inspector de atributos.

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 del color de las celdas en cellForRowAtIndexPath que en el evento cellWillShow, creo.

Subclase UITableViewCell y agregue esto en la implementación:

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

Esto funcionará en el último Xcode.

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

Prueba esto:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top