Estoy usando un UITableView
diseño de 'páginas' de contenido. Estoy usando los encabezados de la vista de tabla para diseñar ciertas imágenes, etc. y preferiría que no flotaran pero permanecieran estáticas como lo hacen cuando el estilo está configurado UITableViewStyleGrouped
.
Aparte de usar UITableViewStyleGrouped
, ¿hay alguna manera de hacer esto? Me gustaría evitar el uso agrupado, ya que agrega un margen hacia abajo en todas mis celdas y requiere deshabilitar la vista de fondo para cada una de las celdas. Me gustaría tener el control total de mi diseño. Idealmente, serían un "UITableViewStyleBareBones", pero no vi esa opción en los documentos ...
Muchas gracias,
ios
objective-c
iphone
cocoa-touch
uikit
Difícil
fuente
fuente
Respuestas:
Debería poder fingir esto utilizando una celda personalizada para hacer sus filas de encabezado. Estos se desplazarán como cualquier otra celda en la vista de tabla.
Solo necesita agregar algo de lógica en su
cellForRowAtIndexPath
para devolver el tipo de celda correcto cuando se trata de una fila de encabezado.Sin embargo, probablemente tendrá que administrar sus secciones usted mismo, es decir, tener todo en una sección y falsificar los encabezados. (También puede intentar devolver una vista oculta para la vista de encabezado, pero no sé si eso funcionará)
fuente
Una forma probablemente más fácil de lograr esto:
C objetivo:
Rápido:
Los encabezados de sección ahora se desplazarán como cualquier celda normal.
fuente
(Para quien llegó aquí debido a un estilo de tabla incorrecto) Cambie el estilo de tabla de plano a agrupado, a través del inspector de atributos o a través del código:
fuente
TableView Style
propiedad en AttributesInspector.ADVERTENCIA : esta solución implementa un método de API reservado. Esto podría evitar que Apple apruebe la aplicación para su distribución en la AppStore.
Describí los métodos privados que hacen que los encabezados de sección floten en mi blog
Básicamente, solo necesita subclasificar
UITableView
y regresarNO
en dos de sus métodos:fuente
Ok, sé que es tarde pero tuve que hacerlo. Llevo 10 horas buscando una solución que funcione pero no encontré una respuesta completa. Encontré algunas pistas pero difícil de entender para los principiantes. Así que tuve que poner mis 2 centavos y completar la respuesta.
Como se ha sugerido en algunas de las respuestas, la única solución de trabajo que pude implementar es insertar celdas normales en la vista de tabla y manejarlas como encabezados de sección, pero la mejor manera de lograrlo es insertando estas celdas en fila 0 de cada sección. De esta manera podemos manejar estos encabezados personalizados no flotantes muy fácilmente.
Entonces, los pasos son.
Implemente UITableView con estilo UITableViewStylePlain.
Implemente titleForHeaderInSection como de costumbre (puede obtener este valor usando su propia lógica, pero prefiero usar delegados estándar).
Número de ejemplo de Secciones en Tabla Ver como de costumbre
Implemente numberOfRowsInSection como de costumbre.
Devuelve 0.0f en heightForHeaderInSection.
NO implemente viewForHeaderInSection. Elimine el método por completo en lugar de devolver nulo.
En heightForRowAtIndexPath. Compruebe si (indexpath.row == 0) y devuelva la altura de celda deseada para el encabezado de sección, de lo contrario, devuelva la altura de la celda.
Ahora en cellForRowAtIndexPath, verifique si (indexpath.row == 0) e implemente la celda como desea que sea el encabezado de la sección y establezca el estilo de selección en none. ELSE implementa la celda como desea que sea la celda normal.
Ahora implemente willSelectRowAtIndexPath y devuelva nil si indexpath.row == 0. Esto cuidará de que didSelectRowAtIndexPath nunca se active para la fila del encabezado de la Sección.
Y finalmente en didSelectRowAtIndexPath, verifique si (indexpath.row! = 0) y continúe.
Con esto has terminado. Ahora tiene un encabezado de sección perfectamente flotante y no flotante.
fuente
En su Interface Builder, haga clic en la vista de tabla problemática
Luego navegue al Inspector de atributos y cambie Style Plain a Grouped;) Easy
fuente
Lo interesante de UITableViewStyleGrouped es que tableView agrega el estilo a las celdas y no a TableView.
El estilo se agrega como backgroundView a las celdas como una clase llamada UIGroupTableViewCellBackground que maneja el dibujo de diferentes fondos de acuerdo con la posición de la celda en la sección.
Entonces, una solución muy simple será usar UITableViewStyleGrouped, establecer el backgroundColor de la tabla en clearColor y simplemente reemplazar el backgroundView de la celda en cellForRow:
fuente
Cambie su estilo de TableView:
Según la documentación de Apple para UITableView:
fuente
Hay otra forma complicada. La idea principal es duplicar el número de sección, y el primero solo muestra el headerView mientras que el segundo muestra las celdas reales.
Lo que hay que hacer entonces es implementar los delegados headerInSection:
Este enfoque también tiene poco impacto en sus fuentes de datos:
En comparación con otros enfoques, esta forma es segura sin cambiar el marco o el contenido de la vista de tabla. Espero que esto pueda ayudar.
fuente
La forma más fácil de obtener lo que desea es establecer su estilo de tabla como
UITableViewStyleGrouped
, estilo separador comoUITableViewCellSeparatorStyleNone
:No intente devolver la vista del pie de página como
nil
, no olvide establecer la altura del encabezado y la vista del encabezado, después de que debe obtener lo que desea.fuente
Aunque esto puede no resolver su problema, lo hizo para mí cuando quería hacer algo similar. En lugar de configurar el encabezado, utilicé el pie de página de la sección anterior. Lo que me salvó fue que esta sección era pequeña y de naturaleza estática, por lo que nunca se desplazó por debajo de la parte inferior de la vista.
fuente
Para Swift 3+
Simplemente use
UITableViewStyleGrouped
y ajuste la altura del pie de página a cero con lo siguiente:fuente
.leastNormalMagnitude
. También debe implementartableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
viewForFooterInSection
función en este caso.0
y.leastNormalMagnitude
tuvo el mismo efecto. Implementar elviewForFooterSection
método es necesario. Deberías volver nulo. Esto está en Swift 5.1 con Xcode 11.3.1.Mientras pensaba cómo abordar este problema, recordé un detalle muy importante sobre UITableViewStyleGrouped. La manera en que UITableView implementa el estilo agrupado (los bordes redondeados alrededor de las celdas) es agregando un backgroundView personalizado a UITableViewCells, y no a UITableView. A cada celda se le agrega un backgroundView de acuerdo con su posición en la sección (las filas superiores obtienen la parte superior del borde de la sección, las del medio obtienen el borde lateral y la inferior obtiene, bueno, la parte inferior). Entonces, si solo queremos un estilo simple, y no tenemos una vista de fondo personalizada para nuestras celdas (que es el caso en el 90% de las veces), entonces todo lo que tenemos que hacer es usar UITableViewStyleGrouped y eliminar el fondo personalizado . Esto se puede hacer siguiendo esos dos pasos:
Cambie nuestro estilo tableView a UITableViewStyleGrouped Agregue la siguiente línea a cellForRow, justo antes de devolver la celda:
cell.backgroundView = [[[UIView alloc] initWithFrame: cell.bounds] autorelease];
Y eso es. El estilo tableView será exactamente igual a UITableViewStylePlain, a excepción de los encabezados flotantes.
¡Espero que esto ayude!
fuente
Tal vez podría usar
scrollViewDidScroll
en la tabla Ver y cambiar elcontentInset
basado en el encabezado visible actual.Parece que funciona para mi caso de uso!
fuente
Otra forma de hacerlo es hacer una sección vacía justo antes de la que desea el encabezado y colocar su encabezado en esa sección. Como la sección está vacía, el encabezado se desplazará inmediatamente.
fuente
Puede agregar una sección (con cero filas) arriba, luego establecer la sección anteriorFooterView como headerView de la sección actual, footerView no flota. Espero que te ayude.
fuente
Ignora XAK. No explore ningún método privado si desea que su aplicación tenga la posibilidad de ser aceptada por Apple.
Esto es más fácil si está utilizando Interface Builder. Agregaría una vista UIView en la parte superior de la vista (donde irán las imágenes), luego agregará su vista de tabla debajo de eso. IB debería dimensionarlo en consecuencia; es decir, la parte superior de la vista de tabla toca la parte inferior de la UIView que acaba de agregar y su altura cubre el resto de la pantalla.
El pensamiento aquí es que si esa UIView no es realmente parte de la vista de tabla, no se desplazará con la vista de tabla. es decir, ignorar el encabezado de la vista de tabla.
Si no está utilizando el creador de interfaces, es un poco más complicado porque debe obtener el posicionamiento y la altura correctos para la vista de tabla.
fuente
Verifique la respuesta sobre cómo implementar encabezados con StoryBoard: Vistas de encabezado de tabla en StoryBoards
También tenga en cuenta que si no implementa
no flotará, que es exactamente lo que quieres.
fuente
Para eliminar completamente las secciones de encabezado de sección flotante, puede hacer esto:
return nil
no funcionaPara deshabilitar los encabezados de sección flotantes pero aún mostrar, puede proporcionar una vista personalizada con sus propios comportamientos.
fuente
Una variación de la solución de @ samvermette:
fuente
El fragmento muestra un encabezado adhesivo solo para la primera sección. Otros encabezados de sección flotarán con celdas.
fuente
Esto se puede lograr asignando la vista de encabezado manualmente en el método viewDidLoad de UITableViewController en lugar de usar viewForHeaderInSection y heightForHeaderInSection del delegado. Por ejemplo, en su subclase de UITableViewController, puede hacer algo como esto:
La vista del encabezado desaparecerá cuando el usuario se desplace. No sé por qué esto funciona así, pero parece lograr lo que estás buscando hacer.
fuente
Quizás pueda simplemente hacer que el fondo de la vista de encabezado sea transparente:
O aplícalo globalmente:
fuente
Tengo otra solución aún más simple, para usar sin autolayout y con todo hecho a través de XIB:
1 / Coloque su encabezado en la vista de tabla arrastrándolo y soltándolo directamente en la vista de tabla.
2 / En el Inspector de tamaño del encabezado recién creado, simplemente cambie su tamaño automático: solo debe dejar los anclajes superior, izquierdo y derecho, más el relleno horizontalmente.
Eso debería hacer el truco !
fuente
De acuerdo con la respuesta de @ samvermette, he implementado el código anterior en Swift para facilitar a los codificadores el uso de swift.
fuente
ref: https://stackoverflow.com/a/26306212
let tableView = UITableView(frame: .zero, style: .grouped)
PLUS
Esto ayudó a usar el espacio del encabezado
fuente
2020 Última actualización
Probado con Xcode 14.
Para ocultar cualquier encabezado de sección, devuelva nulo para el título del delegado de sección
fuente
puede lograrlo fácilmente implementando el método viewForHeaderInSection en la clase delegada tableview. Este método espera una UIView como objeto de retorno (que es su vista de encabezado). He hecho lo mismo en mi código
fuente