Tengo una aplicación en la que UITableView
el recuadro separador está configurado con valores personalizados: derecha 0
, izquierda 0
. Esto funciona perfectamente iOS 7.x
, sin embargo iOS 8.0
, veo que la inserción del separador está configurada en el valor predeterminado de 15
a la derecha. Aunque en los archivos xib que configuró 0
, todavía se muestra incorrectamente.
¿Cómo UITableViewCell
elimino los márgenes del separador?
ios
objective-c
swift
uitableview
ios8
usuario3570727
fuente
fuente
[UIColor clearColor]
y dibujar sus propios separadores. Eres mucho más flexible de esa manera.UITableViewCellSeparatorStyle
valores predeterminados. Incluso la respuesta aceptada es un truco realmente sucio en mi opinión.Respuestas:
iOS 8.0 presenta la propiedad layoutMargins en celdas Y vistas de tabla.
Esta propiedad no está disponible en iOS 7.0, por lo que debe asegurarse de verificar antes de asignarla.
La solución fácil es subclasificar su celda y anular la propiedad de los márgenes de diseño como lo sugiere @ user3570727. Sin embargo, perderá cualquier comportamiento del sistema, como heredar márgenes del Área segura, por lo que no recomiendo la siguiente solución:
(C objetivo)
(rápido 4.2):
Si no desea anular la propiedad, o necesita establecerla condicionalmente, siga leyendo.
Además de la
layoutMargins
propiedad, Apple ha agregado una propiedad a su celda que evitará que herede la configuración de margen de la Vista de tabla. Cuando se establece esta propiedad, sus celdas pueden configurar sus propios márgenes independientemente de la vista de tabla. Piense en ello como una anulación.Se llama a esta propiedad
preservesSuperviewLayoutMargins
y establecerla enNO
permitirá que lalayoutMargin
configuración de la celda anule lo quelayoutMargin
esté configurado en su TableView. Ambos ahorran tiempo ( no tiene que modificar la configuración de la Vista de tabla ) y son más concisos. Consulte la respuesta de Mike Abdullah para obtener una explicación detallada.NOTA: lo que sigue es una implementación limpia para una configuración de margen a nivel de celda , como se expresa en la respuesta de Mike Abdullah. La configuración de su celda
preservesSuperviewLayoutMargins=NO
asegurará que su Vista de tabla no anule la configuración de la celda. Si realmente desea que toda su vista de tabla tenga márgenes consistentes, ajuste su código en consecuencia.Configure los márgenes de su celda:
Swift 4:
Establecer la
preservesSuperviewLayoutMargins
propiedad en su celda en NO debería evitar que su vista de tabla anule los márgenes de su celda. En algunos casos, parece no funcionar correctamente.Si todo falla, puede aplicar fuerza bruta a los márgenes de Vista de tabla:
Swift 4:
... y ahí lo tienes! Esto debería funcionar en iOS 7 y 8.
EDITAR: Mohamed Saleh me llamó la atención sobre un posible cambio en iOS 9. Es posible que deba configurar la Vista de tabla
cellLayoutMarginsFollowReadableWidth
enNO
si desea personalizar inserciones o márgenes. Su kilometraje puede variar, esto no está muy bien documentado.Esta propiedad solo existe en iOS 9, así que asegúrese de verificar antes de configurar.
Swift 4:
(el código anterior del separador 0 UITableView del separador UITableView 0 no funciona )
EDITAR: Aquí hay un enfoque puro de Interface Builder:
NOTA: iOS 11 cambia y simplifica gran parte de este comportamiento, se lanzará una actualización ...
fuente
cell.preservesSuperviewLayoutMargins = NO
por sugerencia de @ bffmike o después de desplazarme por las formas en que aparecerían las inserciones. (wtf ??)cell.preservesSuperviewLayoutMargins
mi método de fuente de datos:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Arg !!! Después de jugar haciendo esto en tu
Cell
subclase:o configurando el
cell.layoutMargins = UIEdgeInsetsZero;
arreglado para mí.fuente
separatorInset
en IB no funcionó. También hay un problema con los colores de fondo de la vista de tabla. Esto es realmente algo enfermo.Dediquemos un momento a comprender el problema antes de cargar a ciegas para intentar solucionarlo.
Un rápido vistazo al depurador le dirá que las líneas de separación son subvistas de
UITableViewCell
. Parece que la propia célula asume una gran cantidad de responsabilidad por el diseño de estas líneas.iOS 8 presenta el concepto de márgenes de diseño . De forma predeterminada, los márgenes de diseño de una vista están
8pt
en todos los lados y se heredan de las vistas de antepasados.Lo mejor que podemos decir es que, al diseñar su línea de separación,
UITableViewCell
elige respetar el margen de diseño de la izquierda, utilizándolo para restringir el recuadro izquierdo.Uniendo todo eso, para lograr la inserción deseada de cero, necesitamos:
0
Dicho así, es una tarea bastante simple de lograr:
Cosas a tener en cuenta:
preservesSuperviewLayoutMargins
si lo desea.preservesSuperviewLayoutMargins
, puede configurar vistas de antepasados (como la tabla) para que también tengan0
margen izquierdo, pero esto parece inherentemente más propenso a errores ya que no controla toda esa jerarquía.0
y dejar a los demás.UITableView
dibujan en la parte inferior de las tablas de estilo plano, supongo que también requerirá especificar la misma configuración a nivel de tabla (¡no lo he probado!)fuente
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
layoutMargins
ypreservesSuperviewLayoutMargins
en la celda es todo lo que se requiere. Cualquier otra cosa se siente como confiar en el vudú.separatorInset
de aUITableViewCell
en iOS 8, debe establecer el conjuntoUIEdgeInsets
en cero tanto en elUITableView
como en elUITableViewCell
. Si no hace las dos cosas, todavía tendrá un recuadro izquierdo mayor que cero. Lo he confirmado varias veces.Creo que esta es la misma pregunta que hice aquí: Eliminar SeparatorInset en iOS 8 UITableView para XCode 6 iPhone Simulator
En iOS 8 , hay una nueva propiedad para todos los objetos que heredan
UIView
. Por lo tanto, la solución para configurarSeparatorInset
en iOS 7.x no podrá eliminar el espacio en blanco que ve en UITableView en iOS 8.La nueva propiedad se llama " layoutMargins ".
La solución:-
Si configura
cell.layoutMargins = UIEdgeInsetsZero;
sin verificar silayoutMargins
existe, la aplicación se bloqueará en iOS 7.x. Entonces, la mejor manera sería verificar silayoutMargins
existe antessetLayoutMargins:UIEdgeInsetsZero
.fuente
Puede usar UIAppearance una vez, al iniciar la aplicación (antes de cargar la IU), para establecerla como configuración global predeterminada:
De esta manera, mantienes limpio el código de tu controlador UIView y siempre puedes anularlo si lo deseas.
fuente
iOS presenta la propiedad layoutMargins en celdas Y vistas de tabla.
Esta propiedad no está disponible en iOS 7.0, por lo que debe asegurarse de verificar antes de asignarla.
Sin embargo, Apple ha agregado una propiedad llamada preservasSuperviewLayoutMargins a su celda que evitará que herede la configuración de margen de su Vista de tabla. De esta manera, sus celdas pueden configurar sus propios márgenes independientemente de la vista de tabla. Piense en ello como una anulación.
Esta propiedad se llama preservesSuperviewLayoutMargins , y establecerla en NO puede permitirle anular la configuración de diseño de la vista de tabla con la configuración de diseño de su propia celda. Ambos ahorran tiempo ( no tiene que modificar la configuración de la Vista de tabla ) y son más concisos. Consulte la respuesta de Mike Abdullah para obtener una explicación detallada.
NOTA: esta es la implementación adecuada y menos complicada, como se expresa en la respuesta de Mike Abdullah; establecer las reservas de su celdaSuperviewLayoutMargins = NO asegurará que su Vista de tabla no anule la configuración de la celda.
Primer paso: configure los márgenes de su celda:
Establecer la propiedad preservasSuperviewLayoutMargins en su celda en NO debería evitar que su vista de tabla anule los márgenes de su celda. En algunos casos, parece no funcionar correctamente.
Segundo paso: solo si todo falla, puede aplicar fuerza bruta a los márgenes de la Vista de tabla:
... y ahí lo tienes! Esto debería funcionar tanto en iOS 8 como en iOS 7.
Nota: probado con iOS 8.1 y 7.1, en mi caso solo necesitaba usar el primer paso de esta explicación.
El segundo paso solo es necesario si tiene una celda despoblada debajo de las celdas renderizadas, es decir. si la tabla es mayor que el número de filas en el modelo de tabla. No hacer el segundo paso daría como resultado diferentes compensaciones de separador.
fuente
willDisplayCell
método ya que el método en sí ya es iOS 8+ y nunca se llamará desde versiones anteriores.En Swift es un poco más molesto porque
layoutMargins
es una propiedad, por lo que debes anular el captador y el definidor.Esto efectivamente hará
layoutMargins
solo lectura, que en mi caso está bien.fuente
Para iOS 9 necesitas agregar:
Para más detalles, consulte la pregunta .
fuente
Solo quería compartir una extensión que hice para eliminar los márgenes de los separadores de celdas de la vista de tabla.
Usado en contexto:
fuente
Rápido:
fuente
Lo hice funcionar haciendo esto:
fuente
En cuanto a lo que sugirió cdstamper en lugar de la vista de tabla, agregar líneas a continuación en el método layoutSubview de la celda funciona para mí.
fuente
Ejemplo de Swift 3.0:
fuente
Después de mucha investigación ...
Aquí está la única forma de controlar completamente estas cosas (que pude encontrar)
Para controlar por completo tanto las separaciones como los márgenes de diseño en cada celda. Haga esto en el
willDisplayCell
método en suUITableviewDelegate
.El objeto de celda controla el separador, y
contentView
controla todo lo demás. Si los espacios de inserción de su separador se muestran en un color inesperado, esto debería resolverlo:fuente
Solución simple en Swift para iOS 8 con una costumbre
UITableViewCell
De esta manera, está configurando
layoutMargin
yseparatorInset
solo una vez en lugar de hacerlo para cada uno,willDisplayCell
como sugiere la mayoría de las respuestas anteriores.Si está utilizando una costumbre,
UITableViewCell
este es el lugar correcto para hacerlo. De lo contrario, deberías hacerlotableView:cellForRowAtIndexPath
.Solo otra pista: ¡no necesita configurarlo
preservesSuperviewLayoutMargins = false
porque el valor predeterminado ya estáNO
!fuente
Para mí, la línea simple hizo el trabajo
fuente
Simplemente agregue el código a continuación puede resolver este programa.
¡Buena suerte para ti!
fuente
Lukasz responde en Swift:
fuente
Este es el código que funciona para mí, en Swift:
Esto me parece el más limpio (por ahora), ya que todos los ajustes de borde / margen de cell / tableView se realizan en el
tableView:willDisplayCell:forRowAtIndexPath:
método, sin meter código innecesariotableView:cellForRowAtIndexPath:
.Por cierto, solo estoy configurando el separador izquierdo de la celdaInset / layoutMargins, porque en este caso no quiero arruinar las restricciones que he configurado en mi celda.
Código actualizado a Swift 2.2:
fuente
La mayoría de las respuestas están mostrando inserciones de separación y márgenes de la disposición que se establecen a través de una variedad de métodos (es decir,
viewDidLayoutSubviews
,willDisplayCell
, etc) para las células y tableviews, pero he encontrado que simplemente poniendo estos encellForRowAtIndexPath
obras grandes. Parece la forma más limpia.fuente
Utilice el fragmento de código a continuación para evitar problemas de relleno no deseados para UITableView en iOS 8 y 7.
fuente
En lugar de actualizar
preservesSuperviewLayoutMargins
ylayoutMargins
cada vez que la celda se desplaza (usandowillDisplayCell
), sugeriría hacerlo una vez encellForRowAtIndexPath:
:fuente
Aquí hay una manera fácil de eliminar globalmente el recuadro.
En
UITableViewCell+Extensions.swift
:En
AppDelegate
application:didFinishLaunchingWithOptions:
:Puede pensar en a) también simplemente anular
separatorInset
en la extensión, o b) establecer el proxy de apariencia paralayoutMargins
, en su lugar. Ninguno de los dos funcionará. AunqueseparatorInset
se indica que es una propiedad, intentar anularla como una propiedad (o método) genera errores de compilación. Y establecer el proxy apariencia deUITableViewCell
'slayoutMargins
(o, para el caso, también el establecimiento de los proxies apariencia deUITableView
' slayoutMargins
yseparatorInset
) no tiene ningún efecto.fuente
En iOS8:
Agregando esto a mi subclase UITableViewCell:
y esto a "tableView: cellForRowAtIndexPath" o "tableView: willDisplayCell":
Trabajó para mi.
fuente
Para cualquier celda específica que desee ocultar el separador.
fuente
Después de haber visto las respuestas en el piso 3, traté de averiguar cuál es la relación de configurar el separador entre TableView y TableViewCell e hice algunas pruebas. Aquí están mis conclusiones:
podemos considerar que establecer el separador de la celda en cero debe mover el separador en dos pasos: el primer paso es establecer el separador de la celda en cero. El segundo paso es establecer el margen de la celda en cero.
establecer el TableView de separatorinset y marginlayout puede afectar de la Célula separatorinset . Sin embargo, a partir de la prueba, encuentro que el separador de inserción de TableView parece ser inútil, la distribución de margen de TableView realmente puede afectar la distribución de margen de la celda .
establecer Cell's PreservesSuperviewLayoutMargins = false, puede cortar el efecto de margen de TableView en las celdas.
Una de las soluciones:
fuente
Esta es mi solución Esto se aplica a la subclase de celda personalizada, solo agréguelas a la subclase.
2)
Y es conveniente que pueda personalizar la posición del separador sin pedirle a su diseñador que dibuje uno para usted ..........
fuente
De una forma más compacta que la respuesta más votada ...
}
fuente
Agregar este fragmento, simple y elegante en Swift me funciona en iOS8 :)
fuente
Esto funcionó perfectamente para mí en iOS 8 e iOS 9.
Para OBJ-C
fuente