Podría alguien decirme la manera de realizar UITableView
animaciones expandibles / contraíbles en sections
de UITableView
la siguiente manera?
o
ios
iphone
uitableview
object
vinnitu
fuente
fuente
Respuestas:
Tienes que crear tu propia fila de encabezado personalizada y ponerla como la primera fila de cada sección. Subclasificar el
UITableView
o los encabezados que ya están allí será un problema. Según la forma en que funcionan ahora, no estoy seguro de que pueda obtener acciones fácilmente de ellos. Puede configurar una celda para que se vea como un encabezado y configurarlatableView:didSelectRowAtIndexPath
para expandir o contraer manualmente la sección en la que se encuentra.Almacenaría una matriz de valores booleanos correspondientes al valor "gastado" de cada una de sus secciones. Luego, podría hacer que
tableView:didSelectRowAtIndexPath
en cada una de sus filas de encabezado personalizado cambie este valor y luego vuelva a cargar esa sección específica.Luego configúrelo
numberOfRowsInSection
para verificar elmybooleans
valor y devolver 1 si la sección no está expandida, o 1+ el número de elementos en la sección si está expandida.Además, deberá actualizar
cellForRowAtIndexPath
para devolver una celda de encabezado personalizada para la primera fila en cualquier sección.fuente
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
es la mejor manera de proporcionar su "propio encabezado personalizado", ya que eso es exactamente para lo que está diseñado.Apple proporciona aquí un código de muestra para animar una acción de expandir / contraer usando un encabezado de sección de vista de tabla: Animaciones y gestos de vista de tabla
La clave de este enfoque es implementar
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
y devolver una UIView personalizada que incluya un botón (normalmente del mismo tamaño que la vista del encabezado). Al crear una subclasificación de UIView y usarla para la vista de encabezado (como hace este ejemplo), puede almacenar fácilmente datos adicionales, como el número de sección.fuente
dequeueReusableHeaderFooterViewWithIdentifier
) - haga clic en esa flecha y vuelva a la primera reproducción e intente cerrarla -> NSInternalInconsistencyException (iOS 8.4 / iPhone 5s)Obtuve una buena solución inspirada en las animaciones y gestos de la vista de tabla de Apple . Eliminé partes innecesarias de la muestra de Apple y la traduje en rápido.
Sé que la respuesta es bastante larga, pero todo el código es necesario. Afortunadamente, puede copiar y pegar la mayor parte del código y solo necesita hacer una pequeña modificación en los pasos 1 y 3
1.crear
SectionHeaderView.swift
ySectionHeaderView.xib
la
SectionHeaderView.xib
(la vista con fondo gris) debería verse así en una vista de tabla (puede personalizarla según sus necesidades, por supuesto):Nota:
a) la
toggleOpen
acción debe estar vinculada adisclosureButton
b) la acción
disclosureButton
ytoggleOpen
no son necesarias. Puede eliminar estas 2 cosas si no necesita el botón.2.crear
SectionInfo.swift
3.en su vista de mesa
fuente
Para implementar la sección de tabla plegable en iOS, la magia es cómo controlar el número de filas para cada sección, o podemos administrar la altura de las filas para cada sección.
Además, necesitamos personalizar el encabezado de la sección para que podamos escuchar el evento tap desde el área del encabezado (ya sea un botón o el encabezado completo).
¿Cómo lidiar con el encabezado? Es muy simple, ampliamos la clase UITableViewCell y creamos una celda de encabezado personalizada como esta:
luego use viewForHeaderInSection para conectar la celda de encabezado:
recuerde que tenemos que devolver el contentView porque esta función espera que se devuelva un UIView.
Ahora tratemos con la parte plegable, aquí está la función de alternar que alterna el accesorio plegable de cada sección:
depende de cómo gestione los datos de la sección, en este caso, tengo los datos de la sección algo como esto:
por fin, lo que tenemos que hacer es basarnos en el accesorio plegable de cada sección, controlar el número de filas de esa sección:
Tengo una demostración completamente funcional en mi Github: https://github.com/jeantimex/ios-swift-collapsible-table-section
Si desea implementar las secciones plegables en una tabla de estilo agrupado, tengo otra demostración con el código fuente aquí: https://github.com/jeantimex/ios-swift-collapsible-table-section-in-grouped-section
Espero que ayude.
fuente
Tengo una mejor solución que debe agregar un UIButton en el encabezado de la sección y establecer el tamaño de este botón igual al tamaño de la sección, pero ocultarlo con un color de fondo claro, después de eso, puede verificar fácilmente en qué sección se hace clic para expandir o contraer
fuente
tableView:numberOfRowsInSection:
permanecerá intacto y podrá seguir utilizándolo por lo que realmente significa. Lo mismo valetableView:cellForRowAtIndexPath:
.UITableViewHeaderFooterView
y agrega unasection
propiedad y define aSectionHeaderViewDelegate
que proporciona la devolución de llamada para abrir / cerrar la sección. ( developer.apple.com/library/ios/samplecode/TableViewUpdates/… )Terminé creando un headerView que contenía un botón (vi la solución de Son Nguyen arriba después del hecho, pero aquí está mi código ... parece mucho pero es bastante simple):
declara un par de bools para tus secciones
...código
ahora en sus métodos delegados de tableview ...
y finalmente la función que se llama cuando toca uno de los botones de encabezado de sección:
fuente
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
en el método de contraer / deshacer, debería animarse bien.Esta es la mejor manera que encontré para crear celdas de vista de tabla expandibles
archivo .h
archivo .m
Métodos de delegado de vista de tabla
fuente
Entonces, según la solución 'botón en el encabezado', aquí hay una implementación limpia y minimalista:
Aquí está el código:
fuente
Encontré otra forma relativamente sencilla de resolver ese problema. Al usar este método, no se nos pedirá que modifiquemos nuestra celda, que casi siempre está relacionada con el índice de la matriz de datos, lo que podría causar un desorden en nuestro controlador de vista.
Primero, agregamos las siguientes propiedades a nuestra clase de controlador:
collapsedSections
guardará los números de sección contraídos.sectionViews
almacenará nuestra vista de sección personalizada.Sintetizarlo:
Inicializarlo:
Después de eso, debemos conectar nuestro UITableView para que se pueda acceder desde dentro de nuestra clase de controlador de vista:
Conéctelo desde XIB para ver el controlador usando
ctrl + drag
como de costumbre.Luego creamos una vista como encabezado de sección personalizado para nuestra vista de tabla implementando este delegado de UITableView:
A continuación, implementamos el método para guardar nuestro encabezado de sección personalizado creado previamente en la propiedad de la clase:
Agregue
UIGestureRecognizerDelegate
a nuestro archivo .h del controlador de vista:Entonces creamos el método
attachTapGestureToView:
El método anterior agregará el reconocedor de gestos de toque a todas las vistas de sección que creamos antes. A continuación deberíamos implementar el
onTap:
selectorEl método anterior se invocará cuando el usuario toque cualquiera de nuestras secciones de vista de tabla. Este método busca el número de sección correcto basado en nuestra
sectionViews
matriz que creamos antes.Además, implementamos el método para obtener la sección a la que pertenece la vista del encabezado.
A continuación, debemos implementar el método
toggleCollapseSection:
Este método insertará / eliminará el número de sección de nuestra
collapsedSections
matriz que creamos antes. Cuando se inserta un número de sección en esa matriz, significa que la sección debe contraerse y expandirse si no.A continuación ponemos en práctica
removeCollapsedSection:
,addCollapsedSection:section
yisCollapsedSection:section
Este método de tres es solo ayuda para facilitarnos el acceso a la
collapsedSections
matriz.Finalmente, implemente este delegado de vista de tabla para que nuestras vistas de sección personalizadas se vean bien.
Espero eso ayude.
fuente
He usado un NSDictionary como fuente de datos, parece mucho código, ¡pero es realmente simple y funciona muy bien! como se ve aqui
Creé una enumeración para las secciones
propiedad de las secciones:
Un método que devuelve mis secciones:
Y luego configurar mi soruce de datos:
Los siguientes métodos le ayudarán a saber cuándo se abre una sección y cómo responder a la fuente de datos tableview:
Responda la sección a la fuente de datos:
Herramientas:
Alternar visibilidad de sección
fuente
// vKj
fuente
// vKj
fuente
Ampliando esta respuesta escrita en Objective C, escribí lo siguiente para aquellos que escriben en Swift
La idea es usar secciones dentro de la tabla y establecer el número de filas en la sección en 1 (contraído) y 3 (expandido) cuando se toca la primera fila de esa sección.
La tabla decide cuántas filas dibujar basándose en una matriz de valores booleanos
Deberá crear dos filas en el guión gráfico y darles los identificadores de reutilización 'CollapsingRow' y 'GroupHeading'
fuente
Apple proporciona un código de muestra para animar una acción de expandir / contraer usando un encabezado de sección de vista de tabla en Animaciones y gestos de vista de tabla .
La clave de este enfoque es implementar
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
y devuelve una UIView personalizada que incluye un botón (normalmente del mismo tamaño que la vista del encabezado). Al crear una subclasificación de UIView y usarla para la vista de encabezado (como hace este ejemplo), puede almacenar fácilmente datos adicionales, como el número de sección.
fuente
He hecho lo mismo usando varias secciones.
fuente
Estoy agregando esta solución para completar y mostrar cómo trabajar con encabezados de sección.
Enlace a la esencia: https://gist.github.com/pawelkijowskizimperium/fe1e8511a7932a0d40486a2669316d2c
fuente
en apoyo a la solución @ jean.timex, use el siguiente código si desea abrir una sección en cualquier momento. cree una variable como: var extendedSection = -1;
fuente