Resumen
de este permita que la solución se bloquear algunos de los colores de fondo de una celda, mientras que el resto son controlados por el comportamiento del sistema.
Basado en mientus' answer, que han creado una solución que le permite especificar qué vistas deben mantener su color de fondo.
Esto todavía permite que otras subvistas de celda tengan su fondo eliminado al resaltar/seleccionar, y es la única solución que funciona en nuestro caso (dos vistas que necesitan un fondo permanente).
he utilizado un enfoque orientado al protocolo, con un protocolo de BackgroundLockable
que contiene la lista de vistas para bloquear, y corriendo un cierre, manteniendo los colores:
protocol BackgroundLockable {
var lockedBackgroundViews: [UIView] { get }
func performActionWithLockedViews(_ action: @escaping() -> Void)
}
extension BackgroundLockable {
func performActionWithLockedViews(_ action: @escaping() -> Void) {
let lockedViewToColorMap = lockedBackgroundViews.reduce([:]) { (partialResult, view) -> [UIView: UIColor?] in
var mutableResult = partialResult
mutableResult[view] = view.backgroundColor
return mutableResult
}
action()
lockedViewToColorMap.forEach { (view: UIView, color: UIColor?) in
view.backgroundColor = color
}
}
}
entonces tengo una subclase de UITableViewCell
, que anula destacando y selección para ejecutar el cierre del protocolo de ahí llamando el comportamiento por defecto (super):
class LockableBackgroundTableViewCell: UITableViewCell, BackgroundLockable {
var lockedBackgroundViews: [UIView] {
return []
}
override func setHighlighted(_ highlighted: Bool, animated: Bool) {
performActionWithLockedViews {
super.setHighlighted(highlighted, animated: animated)
}
}
override func setSelected(_ selected: Bool, animated: Bool) {
performActionWithLockedViews {
super.setSelected(selected, animated: animated)
}
}
}
Ahora sólo tienen que subclase LockableBackgroundTableViewCell
o utilizar el proto BackgroundLockable
col en una clase de celda para agregar fácilmente el comportamiento de bloqueo a algunas celdas!
class SomeCell: LockableBackgroundTableViewCell {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var icon: UIImageView!
@IBOutlet weak var button: UIButton!
override var lockedBackgroundViews: [UIView] {
return [label, icon]
}
}
¿Qué otros elementos de la interfaz están dentro de la vista, que quedan cubiertos por el color de selección celular? – hennes
Actualmente es solo una imagen. Está destinado a hacer que la imagen se vea como una fotografía. Más adelante, agregaré una etiqueta allí también. – P5ycH0