ios uitableview ios7

ios - Cómo ocultar el primer encabezado de sección en UITableView(estilo agrupado)



ios7 (10)

Como el diseño de las vistas de tabla con el estilo agrupado cambió considerablemente con iOS 7, me gustaría ocultar (o eliminar) el primer encabezado de sección. Hasta ahora no he logrado alcanzarlo.

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 se invocarán con el índice de sección 0. Sin embargo, se sigue dibujando un encabezado de sección vacío con la altura predeterminada. (En iOS 6, se invocan los dos métodos. Sin embargo, el resultado visible es el mismo).

Si devuelvo un valor diferente, el encabezado de sección obtiene la altura especificada.

Si devuelvo 0.01, es casi correcto. Sin embargo, cuando enciendo "Color Misaligned Images" 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 tuvieron éxito en 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 el primer encabezado de la sección puede estar completamente oculto.

Actualizar

De acuerdo con 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.


Acabo de copiar tu código y lo intenté. Funciona normalmente (probado en simulador). Adjunté la vista de resultados. Quieres esa vista, ¿verdad? ¿O malinterpreté tu problema?


Actualización [19/9/17]: la respuesta anterior ya no funciona en iOS 11. Gracias Apple. Lo siguiente hizo:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension; self.tableView.estimatedSectionHeaderHeight = 20.0f; self.tableView.contentInset = UIEdgeInsetsMake(-18.0, 0.0f, 0.0f, 0.0);

Respuesta anterior:

Como se publicó en los comentarios de Chris Ostomo, lo siguiente funcionó para mí:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return CGFLOAT_MIN; // to get rid of empty section header }


Esta es la forma de ocultar el primer encabezado de sección en UITableView (estilo agrupado).

Solución Swift 3.0 y Xcode 8.0

  1. El delegado de TableView debe implementar el método heightForHeaderInSection

  2. Dentro del método heightForHeaderInSection, devuelve el número menos positivo. (¡no cero!)

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { let headerHeight: CGFloat switch section { case 0: // hide the header headerHeight = CGFloat.leastNonzeroMagnitude default: headerHeight = 21 } return headerHeight }


La respuesta fue muy divertida para mí y para mi equipo, y funcionó a la perfección

  • En el Creador de interfaces, solo mueva la vista de tabla debajo de otra vista en la jerarquía de vistas.

RAZÓN:

Observamos que esto ocurre solo para la Primera Vista en la Jerarquía de Vista, si esta primera vista es una UITableView . Entonces, todas las otras UITableViews similares no tienen esta sección molesta, excepto la primera. Intentamos mover el UITableView fuera del primer lugar en la jerarquía de vistas, y todo estaba funcionando como se esperaba.


No puedo comentar todavía, pero pensé que agregaría que si tiene un UISearchController en su controlador con UISearchBar como su tableHeaderView , establecer el alto de la primera sección como 0 en heightForHeaderInSection sí funciona.

Yo 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 un encabezado para la primera sección, y desplazarse hacia abajo mostrará la barra de búsqueda justo encima de la primera fila.


Swift3: heightForHeaderInSection funciona con 0, solo tiene que asegurarse de que el encabezado esté configurado en clipsToBounds.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 0 }

si no configura clipsToBounds, el encabezado oculto estará visible cuando se desplace.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { guard let header = view as? UITableViewHeaderFooterView else { return } header.clipsToBounds = true }


Tengo una solución alternativa que me parece razonablemente limpia. Así que estoy respondiendo mi propia pregunta.

Dado que 0 como la altura del encabezado de la primera sección no funciona, devuelvo 1. A continuación, utilizo el contentInset para ocultar esa altura debajo de la barra de navegación.

C objetivo:

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { if (section == 0) return 1.0f; return 32.0f; } - (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section { if (section == 0) { return nil; } else { // return some string here ... } } - (void) viewDidLoad { [super viewDidLoad]; self.tableView.contentInset = UIEdgeInsetsMake(-1.0f, 0.0f, 0.0f, 0.0); }

Rápido:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 1.0 : 32 } override func viewDidLoad() { super.viewDidLoad() tableView.contentInset = UIEdgeInsets(top: -1, left: 0, bottom: 0, right: 0) }


de esta manera está bien.

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { if section == 0 { return CGFloat.min } return 25 } override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { if section == 0 { return nil }else { ... } }


lo más fácil es, por ahora, devolver nil , o "" en func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? para una sección donde no desea mostrar el encabezado.


Usa este truco para tableView de tipo agrupado

Copie y pegue el código debajo de su vista de tabla en el método viewDidLoad :

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