¿Estilo de selección personalizado de UITableViewCell?

82

Cuando hago clic en mi UITableViewCell, la parte de fondo (las áreas que mi imagen de fondo no cubre) se vuelve azul cuando hago clic en la celda. Además, todos los UILabels en la celda se vuelven blancos cuando se hace clic en ella, que es lo que quiero.

Sin embargo, lo que no quiero es el fondo azul cuando hago clic en él, pero si lo hago selectionstylenone, pierdo los colores resaltados para las UILabels en la celda.

Entonces, ¿hay alguna forma de deshacerse del fondo azul cuando se hace clic en la celda, pero para mantener los colores resaltados de la UILabels?

SimplyKiwi
fuente

Respuestas:

174

Puede hacer esto de la siguiente manera. Establezca el estilo de selección de la celda de la tabla en UITableViewCellSelectionStyleNone. Esto eliminará el resaltado de fondo azul. Luego, para que el resaltado de la etiqueta de texto funcione de la manera que desee, en lugar de usar la clase UITableViewCell predeterminada, cree una subclase de UITableViewCelly anule la implementación predeterminada de setHighlighted:animatedcon su propia implementación que establece los colores de la etiqueta como lo desee según el estado resaltado .

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}
jonkroll
fuente
11
Como nota al margen, asegúrese de anular setHighlighted:animated:, que toma el animatedparámetro. Anular el setHighlighted:método de un parámetro no funcionará.
Imre Kelényi
14
¿Deberíamos llamar [super setHighlighted:highlighted animated:animated];?
SoftDesigner
¡Muchas gracias! ¡Funciona de maravilla! Y esto me da control para resaltar otras vistas personalizadas en la celda si quiero, porque el resaltado estándar lo hace extraño.
imike
2
Pero este método tiene un problema cuando anula setHighlightedy setSelected. Primero selecciona una celda, ok, el color del texto cambia a blanco, luego desplaza esa celda fuera de la parte visual de la pantalla, luego se desplaza hacia atrás, mira, el color del texto se vuelve negro
ronan
1
@jonkroll Entendí el concepto, pero mi requisito es que cuando se selecciona una celda, el color de la etiqueta de texto de esa celda debe permanecer como selectedColor, ahora solo está cambiando el color de la etiqueta de texto durante la selección, después de eso el texto seleccionado La etiqueta permanece en el color original
Samarth Kejriwal
75

Si trabaja antes de iOS7, haga que su estilo de selección de celda no sea ninguno

cell.selectionStyle = UITableViewCellSelectionStyleNone;

De lo contrario, déjalo UITableViewCellSelectionStyleDefault

Entonces:

UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView =  selectedView;

Este código funcionará correctamente

Esparto
fuente
2
@iBradApps ... aquí no está creando ninguna clase personalizada ... de la celda ui tableview
Alfa
2
Dando un voto positivo a esto, es la única solución que funcionó para mí para cambiar el color sin texto de una celda seleccionada en iOS 7.
Vern Jensen
1
selectionstyle debe ser selectionStyle
braden
12
Esta solución funcionó en iOS7, pero solo después de establecer selectionStyle en UITableViewCellStyleDefault.
Jay Q.11 de
1
Este método es el único que es absolutamente idéntico al comportamiento de selección de celda "listo para usar" de Apple. Debe aceptarse la respuesta.
mkll
16

Puede utilizar los siguientes métodos de delegado después de establecer el estilo de selección en ninguno:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

Implementa tu código aquí, así

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
    [cell.lbls setTextColor:[UIColor whiteColor]];
    return indexPath;
}
Cicatriz
fuente
1
¡Gran solución limpia! ¡Solo tiene que implementar la llamada willDeselectRowAtIndexPath y funciona como magia!
Matej Balantič
1
Una posible desventaja aquí es que este método no se llama hasta que su dedo abandona la celda seleccionada; algunos otros enfoques entran en vigor tan pronto como tocas la celda.
arlomedia
14

Para que esto funcione, debe establecer el estilo de selección en UITableViewCellSelectionStyleNoney luego debe anular el método setSelected:animated:para obtener el resultado que desea. Hace lo mismo que hace el mecanismo de selección automatizada de iOS cuando ve la selección azul (o gris).

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if (selected) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

También puede personalizar esto de otra manera, por ejemplo, cambiando el fondo de UITableViewCell, etc.

Who9vy
fuente
13

En cellForRowAtIndexPath use este código:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels

Espero que esto funcione para usted.

Disfruta de la codificación :)

Mrunal
fuente
Esta respuesta debe estar en la cima. :)
Chintan Patel
2
Esto no funcionará. Si desea hacer [cell.textLabel setHighlightsTextColor: [UIColor blueColor]]; El estilo de selección de celda no debe ser NINGUNO.
Femina
6

Anulando las siguientes funciones en su subclase de UITableViewCell.

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }
superarts.org
fuente
Gracias; este fue el único que no hace que se seleccione toda la fila desde el borde izquierdo de la pantalla a la derecha al cambiar el color de fondo.
Jose Ramirez
Solo estaba anulando setSelected, razón por la cual, por alguna razón, la celda todavía parpadeaba a veces.
Zonily Jame
3

Para igualar el comportamiento de estilo de selección estándar, querrá anular tanto setHighlighted:animated:y setSelected:animated:. Probablemente desee mover ese código a un método compartido para evitar el código duplicado.

override func setHighlighted(highlighted: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(highlighted, animated: animated)
    super.setHighlighted(highlighted, animated: animated)
}

override func setSelected(selected: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(selected, animated: animated)
    super.setSelected(selected, animated: animated)
}

func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) {

    let action = {
        // Set animatable properties
    }

    if animated {
        UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil)
    }
    else {
        action()
    }
}
Logan Gauthier
fuente
1

En su celda personalizada, anule la implementación predeterminada de awakeFromNib & setSelected:

- (void)awakeFromNib {
    // Initialization code
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds];
    imageView.image = [UIImage imageNamed:@"cell_selected_img"];
    self.selectedBackgroundView = imageView;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    if (selected) {
        self.lblCustomText.textColor = [UIColor whiteColor];
    } else {
        self.lblCustomText.textColor = [UIColor blackColor];
    }
}

También asegúrese de que el estilo de selección NO esté establecido en Ninguno .

Zeeawan
fuente
0

La única forma en que podía hacerlo funcionar era:

- (void)awakeFromNib {
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0];
    bgColorView.layer.masksToBounds = YES;
    self.selectedBackgroundView = bgColorView;
}
Rudolf Real
fuente
0

También puede utilizar contentView.alpha. Aquí está el ejemplo.

Primero, establezca el estilo de selección para su celda:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

A continuación, en la clase de celda personalizada, anule este método con un ejemplo de animación:

  - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        [UIView animateWithDuration:0.15f animations:^{
            self.contentView.alpha = 0.5f;
        }];
    } else {
        [UIView animateWithDuration:0.35f animations:^{
            self.contentView.alpha = 1.f;
        }];
    }
  }
Alex Kolovatov
fuente