Tengo una aplicación en la que el separador UITableView
está configurado con valores personalizados - Derecha 0
, Izquierda 0
. Esto funciona perfectamente en iOS 7.x
, sin embargo, en iOS 8.0
veo que el separador se establece en el valor predeterminado de 15
a la derecha. A pesar de que en los archivos xib se establece en 0
, todavía se muestra incorrectamente.
¿Cómo puedo eliminar los márgenes separadores de la UITableViewCell
?
¡¡¡Arg!!! Después de jugar o hacer esto en su subclase Cell
:
- (UIEdgeInsets)layoutMargins
{
return UIEdgeInsetsZero;
}
o estableciendo el cell.layoutMargins = UIEdgeInsetsZero;
me lo arregló.
Creo que es la misma pregunta que hice aquí: https://stackoverflow.com/questions/25762723/remove-separatorinset-on-ios-8-uitableview-for-xcode-6-iphone-simulator
En iOS 8, hay una nueva propiedad para todos los objetos que heredan de UIView
. Por lo tanto, la solución para establecer el SeparatorInset
en iOS 7.x no será capaz de eliminar el espacio en blanco que se ve en el UITableView en iOS 8.
La nueva propiedad se llama "layoutMargins**".
@property(nonatomic) UIEdgeInsets layoutMargins
Description The default spacing to use when laying out content in the view.
Availability iOS (8.0 and later)
Declared In UIView.h
Reference UIView Class Reference
iOS 8 UITableView setSeparatorInset:UIEdgeInsetsZero setLayoutMargins:UIEdgeInsetsZero]1
La solución:-
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[tableView setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Si estableces cell.layoutMargins = UIEdgeInsetsZero;
sin comprobar si el layoutMargins
existe, la aplicación se bloqueará en iOS 7.x. Por lo tanto, la mejor manera sería comprobar si el layoutMargins
existe primero antes de setLayoutMargins:UIEdgeInsetsZero
.
En Swift es un poco más molesto porque layoutMargins
es una propiedad, por lo que tienes que anular el getter y setter.
override var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set(newVal) {}
}
Esto hará que layoutMargins
sea de sólo lectura, lo que en mi caso está bien.