Pregunta ¿Por qué hay un relleno adicional en la parte superior de mi UITableView con el estilo UITableViewStyleGrouped en iOS7?


Comenzando en iOS7, hay espacio adicional en la parte superior de mi UITableViewque tienen un estilo UITableViewStyleGrouped.

Aquí hay un ejemplo:

enter image description here

La vista de tabla comienza en la primera flecha, hay 35 píxeles de relleno inexplicado, luego el encabezado verde es una UIView devuelto por viewForHeaderInSection (donde la sección es 0).

¿Alguien puede explicar de dónde viene esta cantidad de 35 píxeles y cómo puedo deshacerme de ella sin cambiar a UITableViewStylePlain?


558
2017-09-18 19:07


origen


Respuestas:


Me ayudó lo siguiente:

YouStoryboard.storyboard> YouViewController> Atributo inspector> Desmarcar - Ajusta las inserciones de la vista de desplazamiento.

enter image description here


837
2017-10-01 13:36



Jugué con eso un poco más y parece que esto es un efecto secundario de establecer tableView's tableHeaderView = nil.

Porque mi TableView tiene una apariencia dinámica tableHeaderViewcuando necesito esconder tableHeaderView, en lugar de hacer self.tableView.tableHeaderView = nil;, Hago:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

Me gusta esta solución mejor que configurar un tanto arbitraria contentInset.top porque uso el contentInset.top dinámicamente también. Tener que recordar eliminar un extra de 35px cada vez que recalculo contentInset.top es tedioso


281
2017-09-21 23:33



Para IOS 7 si está asignando una vista de tabla en un controlador de vista, puede ver

self.edgesForExtendedLayout = UIRectEdgeNone;

tu problema parecía similar al mío

Actualizar: 

Swift en iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

170
2017-09-20 21:16



Intenta cambiar el contentInset propiedad que UITableView hereda de UIScrollView.

self.tableView.contentInset = UIEdgeInsetsMake(-36, 0, 0, 0);

Es una solución, pero funciona


148
2017-09-21 17:32



self.automaticallyAdjustsScrollViewInsets = NO;

¡intenta, puedes lidiar con eso!


125
2017-10-29 02:32



Puede detectar si su aplicación ejecuta iOS7 o superior y agregar estos dos métodos en su delegado de vista de tabla (generalmente en su código UIViewController)

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

Esto tal vez no es una solución elegante pero funciona para mí


60
2017-10-25 18:26



He encontrado la causa de mi error original y he creado un proyecto de muestra que lo muestra. Creo que hay un error iOS7.

A partir de iOS7, si crea un UITableView con el estilo Agrupado, pero no tiene un delegado configurado en el primer diseño, entonces establece un delegado y llama a reloadData, habrá un espacio de 35px en la parte superior que nunca desaparecerá.

Mira este proyecto que hice mostrando el error: https://github.com/esilverberg/TableViewDelayedDelegateBug

Específicamente este archivo: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

Si la línea 24 está activa,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

habrá un espacio extra de 35 px en la parte superior. Si la línea 27 está activa y 24 está comentada,

self.tableView.delegate = self;

sin espacio en la parte superior. Es como que tableView está almacenando en caché un resultado en alguna parte y no se está redibujando después de que se establece el delegado y se llama a reloadData.


49
2017-10-05 05:52