Como el diseño de las vistas de tabla que utilizan el estilo agrupado cambió considerablemente con iOS 7, me gustaría ocultar (o eliminar) el encabezado de la primera sección. Hasta ahora no he logrado lograrlo.
Algo simplificado, mi código se ve así:
- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (section == 0)
return 0.0f;
return 32.0f;
}
- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
if (section == 0) {
UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
return view;
}
return nil;
}
- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
if (section == 0) {
return nil;
} else {
// return some string here ...
}
}
Si devuelvo una altura de 0, los otros dos métodos nunca serán llamados con el índice de sección 0. Sin embargo, un encabezado de sección vacío todavía se dibuja con la altura predeterminada. (En iOS 6, se llaman los dos métodos. Sin embargo, el resultado visible es el mismo).
Si devuelvo un valor diferente, el encabezado de la sección obtiene la altura especificada.
Si devuelvo 0.01, es casi correcto. Sin embargo, cuando enciendo "Color de imágenes desalineadas" en el simulador, marca todas las celdas de la vista de tabla (lo que parece ser una consecuencia lógica).
Las respuestas a la pregunta UITableView: ocultar el encabezado de la sección vacía parecen indicar que algunas personas lograron ocultar el encabezado de la sección. Pero podría aplicarse al estilo simple (en lugar del agrupado).
El mejor compromiso hasta ahora es devolver la altura 0.5, lo que resulta en una línea algo más gruesa debajo de la barra de navegación. Sin embargo, agradecería que alguien supiera cómo se puede ocultar completamente el encabezado de la primera sección.
Actualizar
Según el análisis de caglar ( https://stackoverflow.com/a/19056823/413337 ), el problema solo surge si la vista de tabla está contenida en un controlador de navegación.
fuente
section == 0
.Respuestas:
Tengo una solución que me parece razonablemente limpia. Entonces estoy respondiendo mi propia pregunta.
Dado que 0 como la altura del encabezado de la primera sección no funciona, devuelvo 1. Luego utilizo contentInset para ocultar esa altura debajo de la barra de navegación.
C objetivo:
Rápido:
fuente
CGFLOAT_MIN
lugar de un valor codificado. En otras palabras, no lo hagasreturn 1.0f
o0.1f
, en cambio,return CGFLOAT_MIN
si Apple alguna vez cambia el valor mínimo aceptable, tendrás un código para cambiar si codificas el valor de retorno. Además, ya no sabe si está utilizando el valor más pequeño posible. Usando la constante definida, tiene la garantía de usar el valor más pequeño posible y su código sobrevivirá a los cambios del sistema operativo.Así es como se oculta el encabezado de la primera sección en UITableView (estilo agrupado).
Solución Swift 3.0 y Xcode 8.0
El delegado de TableView debe implementar el método heightForHeaderInSection
Dentro del método heightForHeaderInSection, devuelve el número menos positivo. (¡no cero!)
fuente
CGFLOAT_MIN
para objc es idéntico aCGFloat.leastNonzeroMagnitude
en SwiftLa respuesta fue muy divertida para mí y mi equipo, y funcionó a las mil maravillas.
RAZÓN:
Observamos que esto sucede solo para la Primera Vista en la Jerarquía de Vistas, si esta primera vista es una UITableView . Entonces, todos los otros UITableViews similares no tienen esta sección molesta, excepto la primera. Intentamos mover UITableView fuera del primer lugar en la jerarquía de vistas y todo funcionó como se esperaba.
fuente
contentInset
por ejemplo,{0, 64, 0, 0}
para tener el desplazamiento de 64 píxeles desde la parte superior (barra de estado más barra de navegación). El tableView debe adjuntarse en la parte superior de la pantalla, no en la topLayoutGuide (para que llegue debajo de la barra de navegación)Utilice este truco para tableView de tipo agrupado
Copie y pegue el código siguiente para su vista de tabla en el método viewDidLoad :
fuente
_tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 1)]
.de esta manera está bien.
fuente
Copié tu código y lo intenté. Funciona normalmente (probado en simulador). Adjunto vista de resultados. Quieres esa vista, ¿verdad? ¿O entendí mal tu problema?
fuente
Swift3: heightForHeaderInSection funciona con 0, solo tiene que asegurarse de que el encabezado esté configurado en clipsToBounds.
si no establece clipsToBounds, el encabezado oculto será visible al desplazarse.
fuente
Actualización [19/9/17]: La respuesta anterior ya no me funciona en iOS 11. Gracias Apple. Lo siguiente hizo:
Respuesta anterior:
Según lo publicado en los comentarios de Chris Ostomo, lo siguiente funcionó para mí:
fuente
A continuación se explica cómo deshacerse del encabezado de la sección superior en un UITableView agrupado, en Swift:
fuente
En Swift 4.2 y muchas versiones anteriores, en lugar de establecer la altura del primer encabezado en 0 como en las otras respuestas, puede establecer los otros encabezados en
nil
. Supongamos que tiene dos secciones y solo desea que la segunda (es decir,1
) tenga un encabezado. Ese encabezado tendrá el texto Foobar :fuente
Pruebe esto si desea eliminar todo el encabezado de la sección por completo
fuente
No puedo comentar todavía, pero que me gustaría añadir que si usted tiene una
UISearchController
en su controlador conUISearchBar
como sutableHeaderView
, ajustar la altura de la primera sección como 0 enheightForHeaderInSection
realidad funciona.Lo uso
self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);
para que la barra de búsqueda esté oculta por defecto.El resultado es que no hay encabezado para la primera sección, y al desplazarse hacia abajo, se mostrará la barra de búsqueda justo encima de la primera fila.
fuente
lo más fácil con diferencia es regresar
nil
, o""
entrarfunc tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
en una sección en la que no desea mostrar el encabezado.fuente
Versión Swift: Swift 5.1 En su
mayoría, puede establecer la altura en el delegado de tableView de esta manera:
A veces, cuando creó UITableView con Xib o Storyboard, la respuesta de up no funciona. puedes probar la segunda solución:
¡Espero que funcione para ti!
fuente