iphone - reproduccion - el UITableViewCell sin salida de la cola tiene un diseño incorrecto hasta que se desplaza(usando la reproducción automática)
reproduccion automatica youtube (2)
Tengo una subclase UITableViewCell
personalizada a la que se le han aplicado restricciones de reproducción automática en Interface Builder. La celda contiene varias vistas, incluido un UITextField
.
De manera relevante, el tamaño de UITextField
está restringido de tal manera que hay un espacio horizontal predeterminado entre él y la vista siguiente.
La célula se instancia como sigue:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ProgressCell";
ProgressCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath]
cell.textField.text = @"Some string that is different for each cell";
return cell;
}
Cuando aparece la celda por primera vez, el UITextField
supera el marco correcto y aparece detrás de la vista UIView
a su derecha. Sin embargo, cuando muevo la celda fuera de la pantalla, hago una pausa y luego retrocedo, el texto se trunca correctamente.
A continuación se muestra un ejemplo (en la segunda edición).
He intentado llamar a [cell setNeedsLayout]
y [cell setNeedsDisplay]
para la celda en cellForRowAtIndexPath
, así como a realizarlas después de un retraso. Ninguno es efectivo.
¿Qué está haciendo el desplazamiento de la pantalla que hace que la celda aparezca correctamente y cómo puedo replicar esto o solucionar el problema subyacente?
EDITAR:
Vocación
[self.tableView reloadData];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
para recargar la celda, parece que el diseño aparezca correctamente la primera vez.
Sin embargo, ahora se interrumpe (ocasionalmente) en el desplazamiento (es decir, cuando se desplaza hacia atrás, las restricciones de diseño ahora no se aplican correctamente).
Al llamar a [cell setNeedsLayout]
en cellForRowAtIndexPath
no se soluciona este problema.
EDIT2:
La celda superior, como se muestra here , apareció correctamente (como lo hace la celda inferior) hasta que me desplace por la pantalla. Desde entonces desapareció.
Esto refleja el problema desde la primera edición: es la segunda representación que es el problema (¿me hace pensar que podría tener algo que ver con reutilizar la celda?)
De acuerdo con este problema de UILabel
GitHub de varias líneas , este es un error persistente de iOS.
Encontré que en iOS 9+, esta situación ocurre principalmente en el modo de edición, con mucha impredecibilidad.
La siguiente solución solo funciona parcialmente: requiere volver a dibujar el UITableView
dos veces y aún no cubre todos los escenarios.
override func viewDidLoad() {
super.viewDidLoad()
tableView.setNeedsLayout()
tableView.layoutIfNeeded()
tableView.reloadData()
}
Notas:
- Usar
UITextView
es una excelente alternativa a varias líneas deUILabel
, sin el error.UITextView
no muestra ninguna de las otras rarezas deIULabel
, como errores de alineación o flickering . - También hay una solución alternativa en SO-25947146 , que no funcionó para mí, pero vale la pena mencionarlo.
- Parece ocurrir prominentemente cuando
self.tableView.editing
estrue
- El uso de valores bajos para
tableView.estimatedRowHeight
reduce la ocurrencia - Demostración del error en SwiftArchitect/TableViewControllerRowHeightBug
Si nombra una propiedad en una subclase textLabel
o textLabel
, IB ignorará las restricciones que ha especificado y las anulará por defecto, sin advertencias.
Este es el caso incluso en celdas diseñadas en IB con el estilo Personalizado, que no tienen propiedades visibles textLabel
o detailTextLabel
.
Esto también sucede si agrega una propiedad de tipo UIImageView
en una subclase de UITableViewCell
y imageView
.