¿Cómo cambiar el color de resaltado azul de un UITableViewCell?

131

Me pregunto cómo cambiar el color azul de resaltado / selección de a UITableViewCell, ¿alguna idea?

Thomas Joos
fuente

Respuestas:

213

Puede cambiar el color de resaltado de varias maneras.

  1. Cambie la propiedad selectionStyle de su celda. Si lo cambia a UITableViewCellSelectionStyleGray, será gris.

  2. Cambiar la selectedBackgroundViewpropiedad En realidad, lo que crea el degradado azul es una vista. Puede crear una vista y dibujar lo que quiera, y usar la vista como fondo de las celdas de la vista de tabla.

zonble
fuente
8
genial, encontré una buena explicación y ejemplo aquí: cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
Thomas Joos
1
Me di cuenta de que en IB no se puede establecer la "Selección" UITableViewCell en "Ninguno", porque selectedBackgroundViewsimplemente nunca aparecerá. Solo después de establecer "Selección" en Predeterminado, se selectedBackgroundViewmuestra. Probado en iOS 6 y 7.
Jonny
12
Gracias por la gran nota! Esto lo hace tan simple ahora: crea una nueva vista (ni siquiera es necesario especificar el marco: cell.selectedBackgroundView = [UIView new];y establece el color que desee:cell.selectedBackgroundView.backgroundColor = [UIColor colorWithHex:@"ecf2f5" andAlpha:1];
Dannie P
mire al final de esta página, hay enfoques más recientes
Climbatize
145

Zonble ya ha proporcionado una excelente respuesta. Pensé que podría ser útil incluir un fragmento de código corto para agregar un elemento UIViewa la celda de la vista de tabla que se presentará como la vista de fondo seleccionada.

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    UIView *selectionColor = [[UIView alloc] init];
    selectionColor.backgroundColor = [UIColor colorWithRed:(245/255.0) green:(245/255.0) blue:(245/255.0) alpha:1];
    cell.selectedBackgroundView = selectionColor;
  • la celda es mi UITableViewCell
  • Creé una UIView y configuré su color de fondo usando colores RGB (gris claro)
  • Luego configuro la celda selectedBackgroundViewpara que sea la UIViewque creé con el color de fondo elegido

Esto funcionó bien para mí. Gracias por el consejo Zonble.

T Davey
fuente
2
Esto no funciona demasiado bien cuando se usan vistas de tabla con secciones. Cuando se selecciona, la celda perderá los bordes y no se redondeará cuando la primera o la última celda.
Kirk Woll
77
@kirk, te refieres a agrupados :)
Tieme
@Tieme, no, me refiero a las secciones : "Una vista de tabla está compuesta por cero o más secciones, cada una con sus propias filas".
Kirk Woll
Debe colocarlo dentro de 'cellForRowAtIndexPath'. Funciona bien para mí, con una sección. No lo probé con múltiples secciones.
Vincent
Un poco tarde para el juego, pero puedo confirmar que funciona en una vista de tabla con varias secciones (no agrupadas)
matto0
30

UITableViewCell tiene tres estilos de selección predeterminados: -

  1. Azul
  2. gris
  3. Ninguna

La implementación es la siguiente:

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

     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];       
}
Arshad Parwez
fuente
77
en lugar de estos tres estilos predeterminados, también podemos personalizar nuestro estilo esperado mediante la propiedad selectedBackgroundView.
Sunil Targe
Trabajó para mí ... Muchas gracias.
Mujeeb Farooqi
19

En Swift, usa esto en cellForRowAtIndexPath

let selectedView = UIView()
selectedView.backgroundColor = .white
cell.selectedBackgroundView = selectedView

Si desea que su color de selección sea el mismo en todos UITableViewCell, use esto en AppDelegate.

let selectedView = UIView()
selectedView.backgroundColor = .white
UITableViewCell.appearance().selectedBackgroundView = selectedView
alitosuner
fuente
18

Si desea cambiarlo en toda la aplicación, puede agregar la lógica a su delegado de aplicaciones

class AppDelegate: UIResponder, UIApplicationDelegate {

    //... truncated

   func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

        // set up your background color view
        let colorView = UIView()
        colorView.backgroundColor = UIColor.yellowColor()

        // use UITableViewCell.appearance() to configure 
        // the default appearance of all UITableViewCells in your app
        UITableViewCell.appearance().selectedBackgroundView = colorView

        return true
    }

    //... truncated
}
NatashaTheRobot
fuente
Perfecto. ¿Alguna idea de cómo configurar el color del texto de esa celda predeterminada globalmente en select?
BananaAcid
1
esto funciona, pero luego la selección se borra directamente al presionar el nuevo controlador de vista.
bobmoff
Buena manera de hacer cambios globales a UITableViewCell
Shashi3456643
12

para completar: si creó su propia subclase UITableViewCell, puede implementar el - (void)setSelected:(BOOL)selected animated:(BOOL)animatedmétodo y establecer el color de fondo de alguna vista que agregó en la vista de contenido. (si ese es el caso) o de contentView en sí (si no está cubierto por una de sus propias vistas.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if(selected) {
        self.contentView.backgroundColor = UIColor.blueColor;
    } else {
        self.contentView.backgroundColor = UIColor.whiteColor;
    }
}

(¿no usó? para ajustarse al pequeño ancho del código fuente DIV's :)

Este enfoque tiene dos ventajas sobre el uso de SelectedBackgroundView, usa menos memoria y un poco menos de CPU, algo que ni siquiera notarías a menos que muestres cientos de celdas.

Martijn Scheffer
fuente
Esto funciona solo después de una nueva vista asignada a la selectedBackgroundView Al principio del método addself. selectedBackgroundView = [UIView new];
enadun
@enadun Este método funciona para mí en iOS 12, sin ninguna configuración de la selectedBackgroundViewpropiedad.
Nate
11

Tengo que establecer el estilo de selección UITableViewCellSelectionStyleDefaultpara que funcione el color de fondo personalizado. Si hay otro estilo, se ignorará el color de fondo personalizado. Probado en iOS 8.

El código completo para la celda de la siguiente manera:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // This is how you change the background color
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor redColor];
    [cell setSelectedBackgroundView:bgColorView];

    return cell;
}
samwize
fuente
6

Según la respuesta de @ user , puede agregar esta extensión en cualquier parte del código de su aplicación y tener su color de selección directamente en el editor de guiones gráficos para cada celda de su aplicación:

@IBDesignable extension UITableViewCell {
    @IBInspectable var selectedColor: UIColor? {
        set {
            if let color = newValue {
                selectedBackgroundView = UIView()
                selectedBackgroundView!.backgroundColor = color
            } else {
                selectedBackgroundView = nil
            }
        }
        get {
            return selectedBackgroundView?.backgroundColor
        }
    }
}

Color de selección UITableViewCell en storyboard

Climbatizar
fuente
5
@IBDesignable class UIDesignableTableViewCell: UITableViewCell {
  @IBInspectable var selectedColor: UIColor = UIColor.clearColor() {
    didSet {
      selectedBackgroundView = UIView()
      selectedBackgroundView?.backgroundColor = selectedColor
    }
  }
}

En su guión gráfico, establezca la clase de su UITableViewCell en UIDesignableTableViewCell, en el inspector de atributos, puede cambiar el color seleccionado de su celda a cualquier color.

Puede usar esto para todas sus células. Así será su inspector de atributos.

Así es como se verá su inspector de atributos

usuario
fuente
¡Muy creativo! ¡Excelente!
Kaushil Ruparelia
puedes hacerlo aún más simple, mira mi respuesta;) stackoverflow.com/a/51764804/537694
Climbatize
Utilizo una celda personalizada para establecer etiquetas, así que funciona bien, ¡gracias! Cambio para Swift 5: es ahora UIColor.clear, no UIColor.clearColor(). No estoy seguro si eso también es un cambio en Swift, pero también funciona sin él @IBDesignable.
Neph
5

Swift 3.0 / 4.0

Si ha creado su propia celda personalizada, puede cambiar el color de selección awakeFromNib()para todas las celdas:

 override func awakeFromNib() {
    super.awakeFromNib()

    let colorView = UIView()
    colorView.backgroundColor = UIColor.orange.withAlphaComponent(0.4)

    self.selectedBackgroundView = colorView


}
Sam Bing
fuente
0

1- Agregue una vista a la vista de contenido de su celda.
2- Haz clic derecho en tu celda.
3- Realice la vista agregada como "selectedBackgroundView" ingrese la descripción de la imagen aquí

Badr
fuente