2008-11-04 13 views
35

Estoy desarrollando una aplicación de iPhone, en mi vista de tabla quería colores personalizados para el estilo de selección de celdas, leí UITableViewCell Class Reference pero solo hay tres constantes definidas para el estilo de selección (azul, gris, ninguno). Vi una aplicación que usaba un color diferente al definido en la referencia.¿Cómo configuro la propiedad UITableViewCellSelectionStyle en algún color personalizado?

¿Cómo podemos usar un color distinto a los definidos en la referencia?

Gracias de antemano.

+0

¡Recomiendo encarecidamente el enfoque de Matt Gallagher sobre el que usted aceptó! Por favor, considere echarle un vistazo si aún no lo ha hecho. –

+0

Las respuestas en esta publicación son muy complicadas. Todos, por favor ignoren a los más calificados y voten las respuestas correctas, que están en la parte inferior. – bentford

Respuesta

64

La mejor manera de configurar la selección es establecer selectedBackgroundView en la celda cuando la construye.

es decir

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

    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
     cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground.png"]] autorelease]; 
    } 

    // configure the cell 
} 

La imagen utilizada debe tener un buen gradiente (como la selección predeterminada). Si solo desea un color plano, puede usar un UIView en lugar de un UIImageView y configurar el backgroundColor con el color que desee.

Este fondo se aplica automáticamente cuando se selecciona la fila.

+5

¿Qué pasa con las vistas de tabla de estilos agrupados? Acabo de usar una imagen rectangular y se muestra a través de las curvas redondeadas de las celdas de la mesa de trabajo. +1 para una excelente respuesta. – JoePasq

+3

Para las celdas de vista de tabla agrupadas, necesita 4 fondos: superior, inferior, medio y superior e inferior, y debe aplicarlos en función de la ubicación de la celda en el grupo. –

+0

¿No puedes hacer esto sin usar imágenes? –

2

Anular didSelectRowAtIndexPath: y dibujar un UIView del color que elija e insertarlo detrás de UILabel dentro de la celda. Lo haría algo como esto:

UIView* selectedView; //inside your header 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; 
    selectedView = [[UIView alloc] initWithFrame:[cell frame]]; 
    selectedView.backgroundColor = [UIColor greenColor]; //whatever 

    [cell insertSubview:selectedView atIndex:0]; //tweak this as necessary 
    [selectedView release]; //clean up 

} 

Usted puede elegir para animar a cabo este punto de vista cuando se anula la selección y va a satisfacer sus necesidades.

+8

Este enfoque evita el SelectedBackgroundView incorporado de Apple en cada UITableViewCell. Si usa la vista de campo seleccionada, su selección se animará hacia adentro y hacia afuera y también se deseleccionará cuando se le indique. –

+1

Sería mejor anular 'setSelected: highlighted:' en la celda y hacer la lógica allí si vas a tomar este enfoque para que funcione en todos los controladores de vista. Como dijo Matt, usar 'selectedBackgroundView' es un enfoque mucho mejor. –

+0

+1 Buena respuesta, aunque un poco hacky. ¡No es algo malo! – bentford

24

La configuración de selectedBackgroundView parece no tener ningún efecto cuando el cell.selectionStyle se establece en UITableViewCellSelectionStyleNone. Cuando no configuro, el estilo solo usa el gris predeterminado.

Usando la primera sugerencia que inserta el UIView personalizado en la celda manipula la celda pero no aparece cuando se toca la celda, solo después de que se complete la acción seleccionada que es demasiado tarde porque estoy presionando para una nueva vista. ¿Cómo puedo obtener la vista seleccionada en la celda para mostrar antes del comienzo de la operación seleccionada?

+1

Esto necesita más votos positivos. – freespace

+4

Esto es correcto. Necesito establecer selectionStyle en Blur o Gray. Ninguno hará que no funcione. De todos modos, puedes hacer esto anulando el método '-setHighlited: animado:' de la clase 'UITableViewCell'. – Eonil

+1

-1 Esto debería ser un comentario. – bentford

7

Probé algunos de los anteriores, y realidad, yo prefiero crear mi propia subclase de UITableViewCell y luego anular los/touchesCancelled/touchesEnded métodos touchesBegan. Para hacer esto, ignore todas las propiedades selectedBackgroundView y highlightedColor en la celda y, en su lugar, simplemente establezca estos colores manualmente cada vez que se invoque uno de los métodos anteriores. Por ejemplo, si desea establecer la célula para tener un fondo verde con el texto rojo, probar este (dentro de la subclase de celda personalizado):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    //Set backgorund 
    self.backgroundColor = [UIColor themeBlue]; 

    //Set text 
    self.textLabel.textColor = [UIColor themeWhite]; 

    //Call super 
    [super touchesBegan:touches withEvent:event]; 
} 

Tenga en cuenta que para que esto funcione, es necesario establecer:

self.selectionStyle = UITableViewCellSelectionStyleNone; 

De lo contrario, primero obtendrá el estilo de selección actual.

EDIT: Sugiero usar el método touchesCancelled para volver a los colores originales de la celda, pero simplemente ignore el método touchesEnded.

+0

+1 ¡Buena respuesta! – bentford

12

Si ha subclase un UITableViewCell, a continuación, puede personalizar los diferentes elementos de la célula reemplazando el siguiente:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted) { 
     self.backgroundColor = [UIColor redColor]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 

    [super setHighlighted:highlighted animated:animated]; 
} 

EDITAR para iOS7: como se indica Sasho, también es necesario

cell.selectionStyle = UITableViewCellSelectionStyleNone 
+0

+1 Buena respuesta, esto resolvió mi problema. ¡Gracias! – bentford

+0

En iOS 7, la solución anterior funcionaba en combinación con "cell. SelectionStyle = UITableViewCellSelectionStyleNone". – Sasho

1

Subcategoría UITableViewCell y anular setHighlighted:animated:

Puede definir un color de color de selección personalizada estableciendo la backgroundColor (véase la respuesta de WIllster):

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted) { 
     self.backgroundColor = [UIColor redColor]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 

    [super setHighlighted:highlighted animated:animated]; 
} 

Puede definir una imagen de fondo personalizada estableciendo la propiedad backgroundView:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted == YES) 
     self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_default.png"]]; 
    else 
     self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_active.png"]]; 


    [super setHighlighted:highlighted animated:animated]; 
} 
0
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
// Set Highlighted Color 
if (highlighted) { 
self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 
} 
+0

UITableViewCell tiene un método para establecer el color de estado resaltado Aquí, el código spinnet // anima entre el estado regular y resaltado – PK86

0
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Add your Colour. 
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; 
    [self setCellColor:Ripple_Colour ForCell:cell]; //highlight colour 
} 

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Reset Colour. 
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; 
    [self setCellColor:Ripple_Colour ForCell:cell]; //normal color 

} 

- (void)setCellColor:(UIColor *)color ForCell:(UITableViewCell *)cell { 
    cell.contentView.backgroundColor = color; 
    cell.backgroundColor = color; 
} 
0

Para añadir un color personalizado usar el siguiente código . Y para que sea uso transparente alpha: 0.0

cell.selectedBackgroundView = UIView(frame: CGRect.zero) 
cell.selectedBackgroundView?.backgroundColor = UIColor(red:0.27, green:0.71, blue:0.73, alpha:1.0) 

Si utiliza el color a medida y quiere darle la esquina redondeada vistazo uso:

cell.layer.cornerRadius = 8 

Además, utilice esta opción para facilitar la animación y se sienten

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    tableView.deselectRow(at: indexPath, animated: true) 
} 
Cuestiones relacionadas