iphone - opaca - ¿Cómo personalizar el color de fondo de una UITableViewCell?
la pantalla de mi iphone se ve opaca (17)
Me gustaría personalizar el fondo (y quizás también el borde) de todas las UITableViewCells dentro de mi UITableView. Hasta ahora no he podido personalizar esto, así que tengo un montón de celdas de fondo blanco que es el predeterminado.
¿Hay alguna manera de hacer esto con el iPhone SDK?
Crea una imagen para usar como fondo con Photoshop o gimp y nómbrala como myimage. A continuación, 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.
Crea una vista y configúrala como vista de fondo de la celda
UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
[lab setBackgroundColor:[UIColor grayColor]];
cell.backgroundView = lab;
[lab release];
Debe establecer el color de fondo del contenido de la celda a su color. Si utiliza accesorios (como flechas de divulgación, etc.), se mostrarán en color blanco, por lo que es posible que deba rodar versiones personalizadas de los mismos.
Después de probar todas las diferentes soluciones, 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];
}
}
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 celda. Por supuesto, esto se ve bien en las tablas con estilo indexado solamente, sin importar con o sin accesorios.
Aquí hay una muestra donde se jacta el fondo de la celda amarilla:
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 ];
}
Esta es la forma más eficiente que he encontrado para resolver este problema, use el método de delegado willDisplayCell (esto también cuida el color blanco del fondo de la etiqueta de texto al usar cell.textLabel.text y / o cell.detailTextLabel.text )
- (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 { ... }
Entonces, dentro del cuerpo del método de delegado de celda, agregue el siguiente código para alternar colores de celdas o simplemente use la llamada a 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 simple como agrupado:
Código:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundColor = [UIColor redColor];
}
PD: Aquí la extracción de documentación para willDisplayCell:
"Una vista de tabla envía este mensaje a su delegado justo antes de que use la celda para dibujar una fila, lo que permite al delegado personalizar el objeto de la celda antes de que se muestre. Este método le da al delegado la oportunidad de anular las propiedades basadas en el estado establecidas anteriormente por la vista de tabla, como la selección y el color de fondo. Después de que el delegado regrese, la vista de tabla establece solo las propiedades alfa y de marco, y luego solo cuando se animan las filas a medida que se deslizan hacia adentro o hacia afuera ".
Encontré esta información en esta publicación de Colionel . ¡Gracias a el!
Esto funcionará en el último Xcode.
-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
cell.backgroundColor = [UIColor grayColor];
}
Estoy de acuerdo con Seba, traté de establecer mi color de fila alterna en el método de delegado rowForIndexPath pero obtenía 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;
}
}
La personalización del fondo de una celda de vista de tabla finalmente 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 parece extraña.
La razón es que la celda 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 la celda completa, tendrá un bloque de color que abarca el ancho de la vista.
Definitivamente puedes personalizar una celda, pero no es tan fácil como crees al principio.
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 los botones de divulgación, y es mejor para su lógica actuar sobre el estado de color de las celdas en cellForRowAtIndexPath que en el evento cellWillShow, creo.
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 configura el resto de la información para la celda de la tabla, que normalmente es cuando está en el Método cellForRowAtIndexPath, puede hacer esto reemplazando 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 que los fondos del botón de divulgación, etc. no sean correctos, pero le permite controlar el color en el método cellForRowAtIndexPath donde estás haciendo todas tus otras personalizaciones de celular.
Entonces: si agrega este método al delegado de la 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 lo siguiente:
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 en los que puede adaptar / personalizar su celda de tabla: toda la personalización puede ir en el método cellForRowAtIndexPath.
Prueba esto:
- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell setBackgroundColor:[UIColor clearColor]];
tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
Simplemente ponga esto en su archivo de clase de 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;
}
Subclass UITableViewCell y agregar esto en la implementación:
-(void)layoutSubviews
{
[super layoutSubviews];
self.backgroundColor = [UIColor blueColor];
}
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 manera de borrar correctamente el color (prueba su muestra, pero establece ''clearColor'' en lugar de ''yellowColor''), que es lo que estaba tratando de hacer.
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];