Tengo un problema extraño UITableView
solo con iOS 7.
UITableViewCellSeparator
desaparece por encima de la primera fila y debajo de la última fila. A veces, después de seleccionar las filas o algunas acciones de desplazamiento, aparece.
En mi caso tableView
se carga desde el Storyboard
con UITableViewStylePlain
estilo. El problema seguramente no está en UITableViewCellSeparatorStyle
, que no se cambia de forma predeterminada UITableViewCellSeparatorStyleSingleLine
.
Como leí en los foros de desarrollo de Apple ( aquí y aquí ) otras personas tienen ese problema y se encuentran algunas soluciones, por ejemplo:
Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.
Pero todavía estoy buscando la razón de tal comportamiento extraño separador.
¿Algunas ideas?
Actualización: como vi en XCode 5.1 DP y iOS 7.1 beta, Apple intentó solucionar este problema. Ahora el separador se muestra según sea necesario a veces debajo de la última fila, después de un poco de actualización, pero no después de la creación de la vista de tabla.
Respuestas:
Descarté la jerarquía de subvista de las celdas afectadas y descubrí que
_UITableViewCellSeparatorView
estaba configurada como oculta. ¡No es de extrañar que no se muestre!Me anulé
layoutSubviews
en miUITableViewCell
subclase y ahora los separadores se muestran de manera confiable:Objetivo-C :
Rápido :
Las otras soluciones propuestas aquí no funcionaron de manera consistente para mí o parecen torpes (agregando vistas de pie de página personalizadas de 1 px).
fuente
Esto funcionó para mí:
fuente
También tuve el problema con la falta de separador y descubrí que el problema sólo ocurrió cuando
heightForRowAtIndexPath
estaba volviendo un número decimal . Solución:fuente
¿Intentó agregar una UIView de altura 1 en el encabezado y el pie de página de la tabla con un color de fondo gris claro? Básicamente se burlará del primer y último separador.
fuente
@samvermette
Solucioné el problema usando estos métodos de delegado. Ahora no parpadea:
fuente
Encontramos este problema en nuestra aplicación. Cuando el usuario seleccionó una celda, se introdujo una nueva vista de tabla en la pila del controlador de navegación y luego, cuando el usuario la abrió, faltaba el separador. Lo resolvimos poniendo
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
en eldidSelectRowAtIndexPath
método delegado de vista de tabla.fuente
self.tableView.allowsMultipleSelection = NO;
?Aquí hay una solución más fácil (aunque un poco desordenada) si la necesita, intente seleccionar y anular la selección de la celda después de que se vuelvan a cargar los datos y se complete la animación predeterminada.
solo agrega:
fuente
Descubrí que la solución más fácil es, después de volver a cargar una celda, también recargar la celda anterior:
fuente
Una solución simple y limpia que funciona tanto en iOS 8 como en iOS 9 (beta 1)
Aquí hay una solución simple, limpia y no intrusiva. Implica llamar a un método de categoría que arreglará los separadores.
Todo lo que necesita hacer es caminar por la jerarquía de la celda y quitar el separador. Me gusta esto:
Lo que recomiendo es agregar esto a una categoría en UITableViewCell, así:
Debido a que el separador puede desaparecer en una celda diferente a la seleccionada actualmente, probablemente sea una buena idea llamar a esta corrección en todas las celdas en la vista de tabla. Para eso, puede agregar una categoría a UITableView que sea así:
Con esto en su lugar, puede llamar
-fixSeparatos
a su TableView justo después de la acción que hace que desaparezcan. En mi caso, fue después de llamar[tableView beginUpdates]
y[tableView endUpdates]
.Como dije al principio, lo probé tanto en iOS 8 como en iOS 9. Supongo que funcionará incluso en iOS 7, pero no tengo forma de probarlo allí. Como probablemente ya sepa, esto sí juega con los componentes internos de la célula, por lo que podría dejar de funcionar en alguna versión futura. Y Apple podría teóricamente (0.001% de probabilidad) rechazar su aplicación debido a esto, pero no puedo ver cómo incluso podrían descubrir lo que está haciendo allí (los analizadores estáticos no pueden detectar el sufijo de una clase como algo mal, en mi opinión).
fuente
Basado en el comentario de @ ortwin-gentz, esta solución funciona para mí en iOS 9.
(Código SWIFT)
Uso la función fixCellsSeparator () después de llamar a endUpdates () en algunos métodos de mi tableView, por ejemplo:
¡Espero que esta solución sea útil para alguien!
fuente
Complemento a la respuesta de airpaulg.
Básicamente, uno tiene que implementar dos métodos UITableDelegate. Aquí está mi solución que funciona tanto en iOS7 como en iOS6.
// Esto ocultará la cuadrícula de la tabla vacía debajo de las celdas si no cubren toda la pantalla
fuente
Esto solucionó el problema para mí:
Asegúrese de que
clipsToBounds
esté establecido en SÍ para la celda, pero NO para la celdacontentView
. También establecercell.contentView.backgroundColor = [UIColor clearColor];
fuente
Parece que este problema se manifiesta en muchas circunstancias.
Para mí tenía algo que ver con la selección celular. No tengo idea de por qué y no tuve tiempo de profundizar demasiado, pero puedo decir que comenzó a ocurrir cuando configuré las celdas
selectionStyle
en ninguno. es decir:Intenté usar algunos de los métodos de delegado anteriores que activan y desactivan la
separatorStyle
propiedad deltableView
pero no parecen hacer nada para solucionar mi problema.La razón por la que necesitaba eso era porque ni siquiera necesitaba la selección celular.
Entonces, encontré algo que funcionó para mí. Acabo de deshabilitar la selección en
UITableView
:Espero que esto ayude a alguien, si no necesita tener una selección celular.
fuente
Intenté muchas sugerencias para solucionarlo, pero no puedo solucionarlo. Finalmente decidí personalizar la línea de separación de la siguiente manera:
P / S: personalizado en willDisplayCell NO cellForRowAtIndexPath
fuente
Sorprendentemente, cambiar el
separatorInset
valor de la celda de un lado a otro parece estar funcionando:fuente
También tuve el problema de esta línea de separación inconsistente en la parte inferior de mi UITableView. Utilizando una vista de pie de página personalizada, he podido crear una línea similar y mostrarla encima de la posible existente (que a veces faltaba).
El único problema de esta solución es que Apple puede cambiar un día el grosor de la línea.
fuente
He resuelto poner estas líneas de código donde se realiza la actualización de la vista de tabla:
Por ejemplo, en mi caso los puse aquí:
fuente
Debe eliminar una selección de celda antes de realizar la actualización de la celda. Entonces podrías restaurar la selección.
fuente
Para solucionar el problema anterior, agregue un pie de página vacío en viewDidLoad.
No utilice las líneas anteriores en el método de delegado viewForFooterInSection. Significa No implementar el método viewForFooterInSection.
fuente
para ampliar la respuesta de airpaulg, porque no funcionó del todo para mí ...
También tuve que implementar el método heightforfooter para obtener la altura
entonces noté que el color gris claro es demasiado oscuro. Lo arreglé agarrando el color del separador actual de la vista de tabla y usando eso:
UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];
fuente
También me encontré con este problema en nuestro proyecto. Mi vista de tabla tenía un tableFooterView que podía hacer que esto sucediera. Encontré que el separador debajo de la última fila aparecería si eliminara esa tablaFooterView.
fuente
Lo que marcó la diferencia para mí fue volver a cargar la fila para la que no aparecería la línea de separación inferior:
fuente
Resuelvo este problema de otra manera: agrego una capa que tiene una altura de 0.5px y su color es gris claro en tableview.tableFooterView como su subcapa.
El código es así:
fuente
En su subclase UITableViewCell, implemente layoutSubviews y agregue:
fuente
Como alguien más mencionó, este problema parece manifestarse en una variedad de formas. Resolví mi problema a través de la siguiente solución:
fuente
Al revisar las respuestas y soluciones, se me ocurrieron tales observaciones:
Esto parece ser problemático tanto en iOS 7 como en 8. Noté el problema al seleccionar la celda del código en el
viewDidLoad
método, por lo que:1) la solución lo estaba haciendo
viewDidAppear:
si a alguien no le importa el retraso notable entre la presentación de la vista y la selección de la celda2) la segunda solución funcionó para mí, pero el código parece un poco frágil ya que se basa en la implementación interna de
UITableViewCell
3) agregar un separador propio parece ser el más flexible y mejor por ahora, pero requiere más codificación :)
fuente
Establecer el estilo
viewWillAppear
funcionó para mí.fuente
Como esto sigue siendo un problema con iOS 8, agregaré mi solución en Swift. Establezca la línea de separación de tableview en none. Luego agregue este código al método de delegado cellForRowAtIndexPath. Agregará un buen separador. La instrucción if permite decidir qué celdas deben tener un separador.
fuente
Aquí está mi solución a este problema. Después de insertar su (s) celda (s), vuelva a cargar la sección. Si la recarga de toda la sección es demasiado intensa para usted, simplemente vuelva a cargar los indexPaths arriba y abajo.
fuente
encontré un problema similar, descubrí que otra buena solución, especialmente si su dataSource no es grande, es volver a cargar el tableData cuando implemente el
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
método, aquí hay un ejemplo:También puede volver a cargar datos no visibles basados en la fuente de datos visible, pero eso requiere más pirateo.
¡Tenga en cuenta que esta función de delegado está incluida en el
UITableViewDelegate
protocolo!¡Espero eso ayude!
fuente