Estoy implementando una vista de tabla de selección de color donde el usuario puede seleccionar, por ejemplo, 10 colores (depende del producto). El usuario también puede seleccionar otras opciones (como la capacidad del disco duro, ...).
Todas las opciones de color están dentro de su propia sección de vista de tabla.
Quiero mostrar un pequeño cuadrado a la izquierda de la etiqueta de texto que muestra el color real.
En este momento estoy agregando un simple UIView cuadrado, darle el color de fondo correcto, como este:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RMProductAttributesCellID];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:RMProductAttributesCellID] autorelease];
cell.indentationWidth = 44 - 8;
UIView *colorThumb = [[[UIView alloc] initWithFrame:CGRectMake(8, 8, 28, 28)] autorelease];
colorThumb.tag = RMProductAttributesCellColorThumbTag;
colorThumb.hidden = YES;
[cell.contentView addSubview:colorThumb];
}
RMProductAttribute *attr = (RMProductAttribute *)[_product.attributes objectAtIndex:indexPath.section];
RMProductAttributeValue *value = (RMProductAttributeValue *)[attr.values objectAtIndex:indexPath.row];
cell.textLabel.text = value.name;
cell.textLabel.backgroundColor = [UIColor clearColor];
UIView *colorThumb = [cell viewWithTag:RMProductAttributesCellColorThumbTag];
colorThumb.hidden = !attr.isColor;
cell.indentationLevel = (attr.isColor ? 1 : 0);
if (attr.isColor) {
colorThumb.layer.cornerRadius = 6.0;
colorThumb.backgroundColor = value.color;
}
[self updateCell:cell atIndexPath:indexPath];
return cell;
}
Esto se muestra bien sin problemas.
Mi único problema es que cuando selecciono una fila de "color", durante la animación de selección de fundido a azul, se oculta mi UIView (colorThumb) personalizada. Se vuelve a ver justo después de que finalizó la animación de selección / deselección, pero esto produce un feo artefacto.
¿Qué debo hacer para corregir esto? ¿No inserto la subvista en el lugar correcto?
(No hay nada especial en didSelectRowAtIndexPath, solo cambio el accesorio de la celda a una casilla de verificación o nada, y deselecciono el indexPath actual).
fuente
Respuestas:
UITableViewCell
cambia el color de fondo de todos los puntos de vista sub cuando se selecciona o resalta celular, puede resolver este problema primordial de la célula TableViewsetSelected:animated
ysetHighlighted:animated
y restablecer el color de fondo Vista.En el objetivo C:
En Swift 3.1:
fuente
if (highlighted)
yif (selected)
? Creo que funcionará si no tenemos esas condiciones.Esto se debe a que la celda de vista de tabla cambia automáticamente el color de fondo de todas las vistas dentro de la vista de contenido para el estado resaltado. Puede considerar subclasificar
UIView
para dibujar su color o usarUIImageView
con una imagen estirada personalizada de 1x1 px.fuente
setHighlighted:animated:
ysetSelected:animated:
Encontró una solución bastante elegante en lugar de jugar con los métodos de selección / resaltado tableViewCell. Puede crear una subclase de UIView que ignore establecer su color de fondo para borrar el color.
Swift 3/4:
Swift 2:
Versión Obj-C:
fuente
Otra forma de manejar el problema es llenar la vista con un degradado de gráficos centrales, como:
fuente
Para Swift 2.2 esto funciona
y la razón es explicada por @ Andriy
fuente
Inspirado por Yatheesha BL 's respuesta creé una categoría UITableViewCell / extensión que le permite encender y apagar esta 'característica' transparencia.
Rápido
C objetivo
KeepBackgroundCell es compatible con CocoaPods. Puedes encontrarlo en GitHub
fuente
Puede
cell.selectionStyle = UITableViewCellSelectionStyleNone;
, luego establecer el color de fondo en- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
fuente
Inspirado por Yatheesha BL .
Si llama a super.setSelected (seleccionado, animado: animado), borrará todo el color de fondo que establezca . Por lo tanto, no llamaremos super método.
En Swift:
fuente
Para el caso de mayo, este es el Septs para evitar obtener el color gris para todos los elementos en la celda (en caso de que esté usando una celda de vista de tabla personalizada):
Establezca selectionStyle en .none 👉
selectionStyle = .none
Anular este método.
Llame al super, para obtener el beneficio de la super configuración.
Haz lo que quieras resaltando la lógica que quieras.
fuente
UITableViewCell cambia el color de fondo de todas las subvistas en la selección por alguna razón.
Esto podría ayudar:
DVColorLockView
Use algo así para evitar que UITableView cambie el color de su vista durante la selección.
fuente
Dibuje la vista en lugar de establecer el color de fondo
fuente
Solución SIMPLEST sin errores con animación (como en la respuesta mejor calificada) y sin subclases y dibujos: configure el color del borde de la capa en lugar de backgroundColor y establezca un ancho de borde muy grande.
fuente
Pruebe el siguiente código:
fuente
No olvide anular
setSelected
tan bien comosetHighlighted
fuente
Esto es similar a la respuesta de Pavel Gurov, pero más flexible ya que permite que cualquier color sea permanente.
fuente
Quería mantener el comportamiento de selección predeterminado, excepto para una subvista de celda que quería ignorar el cambio automático de color de fondo. Pero también necesitaba poder cambiar el color de fondo en otros momentos.
La solución que se me ocurrió fue crear una subclase,
UIView
por lo que ignora la configuración del color de fondo normalmente y agrega una función separada para evitar la protección.Swift 4
fuente
aquí está mi solución, use contentView para mostrar selectionColor, funciona perfectamente
fuente
Coloque este código en su subclase de
UITableViewCell
Sintaxis de Swift 3
fuente
Agregar otra solución si está usando guiones gráficos. Crear una subclase de
UIView
eso no permitebackgroundColor
que se establezca después de que se establece inicialmente.fuente
Si la solución de fondo mencionada anteriormente no está solucionando su problema, su problema puede estar en su
datasource
para su TableView.Para mí, estaba creando una instancia de un objeto DataSource (llamado
BoxDataSource
) para manejar los métodos delegado y dataSource tableView, así:Esto causaba que la fuente de datos se desasignara cada vez que se tocaba la celda, y por lo tanto, todo el contenido desaparecía. La razón es que la asignación de ARC / recolección de basura es natural.
Para solucionar esto, tuve que ir a la celda personalizada, agregar una variable de fuente de datos:
Luego, debe establecer el origen de datos en el origen de datos de la celda
var
que acaba de crear en cellForRow, por lo que esto no se desasigna con ARC.Espero que ayude.
fuente