Estoy creando una aplicación que tendrá una pregunta en UILabel
ay una respuesta de opción múltiple en UITableView
cada fila mostrando una opción múltiple. Las preguntas y respuestas variarán, así que necesito UITableView
que sea dinámico en altura.
Me gustaría encontrar una sizeToFit
solución para la mesa. Donde el marco de la tabla se establece a la altura de todo su contenido.
¿Alguien puede aconsejar sobre cómo puedo lograr esto?
- sizeToFit
método de UIView ?Respuestas:
En realidad encontré la respuesta yo mismo.
Acabo de crear una nueva
CGRect
paratableView.frame
elheight
detable.contentSize.height
Eso establece la altura de
UITableView
laheight
de su contenido. Como el código modifica la IU, no olvide ejecutarlo en el hilo principal:fuente
Solución Swift 5 y 4.2 sin KVO, DispatchQueue o sin establecer restricciones usted mismo.
Esta solución se basa en la respuesta de Gulz .
1) Crear una subclase de
UITableView
:2) Agregue un
UITableView
a su diseño y establezca restricciones en todos los lados. Establezca la clase aContentSizedTableView
.3) Debería ver algunos errores, porque Storyboard no tiene
intrinsicContentSize
en cuenta nuestra subclase . Solucione esto abriendo el inspector de tamaño y anulando intrinsicContentSize a un valor de marcador de posición. Esta es una anulación para el tiempo de diseño. En tiempo de ejecución usará la anulación en nuestraContentSizedTableView
claseActualización: código modificado para Swift 4.2. Si está utilizando una versión anterior, use en
UIViewNoIntrinsicMetric
lugar deUIView.noIntrinsicMetric
fuente
tableView
para estarIntrinsicTableView
en el guión gráfico. No necesitaba insertar mi vista de tabla dentro de otraUIView
.tableView
aIntrinsicTableView
. Además,UIView
no es necesario un envoltorio adicional . Puede utilizar cualquier vista principal existente, por supuesto :)tableView.sizeToFit()
sizeToFit()
deben llamarseSolución rápida
Sigue estos pasos:
1- Establezca la restricción de altura para la tabla desde el guión gráfico.
2- Arrastre la restricción de altura desde el guión gráfico y cree @IBOutlet para ella en el archivo del controlador de vista.
3- Luego puedes cambiar la altura de la mesa dinámicamente usando este código:
Actualizar
Si la última fila se corta por usted, intente llamar a viewWillLayoutSubviews () en la función de celda willDisplay:
fuente
He intentado esto en iOS 7 y funcionó para mí.
fuente
Agregue un observador para la propiedad contentSize en la vista de tabla y ajuste el tamaño del marco en consecuencia
luego en la devolución de llamada:
Espero que esto te ayudará.
fuente
Tenía una vista de tabla dentro de la vista de desplazamiento y tuve que calcular la altura de tableView y cambiar su tamaño en consecuencia. Esos son los pasos que he tomado:
0) agregue una UIView a su scrollView (probablemente funcionará sin este paso, pero lo hice para evitar posibles conflictos): esta será una vista de contenedor para su vista de tabla. Si toma este paso, configure los bordes de las vistas directamente a los de la vista de tabla.
1) crea una subclase de UITableView:
2) establezca la clase de una vista de tabla en Storyboard en IntrinsicTableView: captura de pantalla: http://joxi.ru/a2XEENpsyBWq0A
3) Establezca heightConstraint en su vista de tabla
4) arrastre el IBoutlet de su tabla a su ViewController
5) arrastre el IBoutlet de la restricción de altura de su tabla a su ViewController
6) agregue este método a su ViewController:
Espero que esto ayude
fuente
En caso de que no desee realizar un seguimiento de los cambios en el tamaño del contenido de la vista de tabla, puede encontrar esta subclase útil.
fuente
override public var intrinsicContentSize: CGSize { //... return someCGSize }
En caso de que su contentSize no sea correcto, esto se debe a que se basa en el estimadoRowHeight (automático), use esto antes
fuente: https://forums.developer.apple.com/thread/81895
fuente
Swift 3, iOS 10.3
Solución 1: simplemente poner
self.tableview.sizeToFit()
encellForRowAt indexPath
función. Asegúrese de establecer la altura de la vista de tabla más alta de lo que necesita. Esta es una buena solución si no tiene vistas debajo de la vista de tabla. Sin embargo, si tiene, la restricción de la vista de tabla inferior no se actualizará (no intenté solucionarlo porque se me ocurrió la solución 2)Ejemplo:
Solución 2: establezca la restricción de altura de la vista de tabla en el guión gráfico y arrástrela al ViewController. Si conoce la altura promedio de su celda y sabe cuántos elementos contiene su matriz, puede hacer algo como esto:
*EDITAR:
Después de todas las soluciones que probé y cada una de ellas estaba arreglando algo, pero no completamente, esta es la respuesta que explica y soluciona este problema por completo.
fuente
La respuesta de Mimo y respuesta Anooj VM 's tanto son impresionantes, pero hay un pequeño problema si usted tiene una lista grande, es posible que la altura del marco será cortar otras algunas de sus células.
Entonces. He modificado un poco la respuesta:
fuente
Hay una manera mucho mejor de hacerlo si usa AutoLayout: cambie la restricción que determina la altura. Simplemente calcule la altura del contenido de su tabla, luego encuentre la restricción y cámbiela. Aquí hay un ejemplo (suponiendo que la restricción que determina la altura de su tabla es en realidad una restricción de altura con relación "Igual"):
fuente
myTableHeightConstraint.constant = tableView.contentSize.height
Esto funciona para mí usando Auto Layout, con una vista de tabla con solo una sección.
Llamo a esta función cuando configuro el diseño automático (la muestra aquí usa SnapKit, pero se entiende la idea):
Quiero que UITableView solo sea tan alto como la altura combinada de las celdas; Recorro las celdas y acumulo la altura total de las celdas. Dado que el tamaño de la vista de tabla es CGRect.zero en este punto, necesito establecer los límites para poder respetar las reglas de Diseño automático definidas por la celda. Establezco el tamaño en un valor arbitrario que debería ser lo suficientemente grande. El tamaño real será calculado más tarde por el sistema de diseño automático.
fuente
Lo hice de una manera un poco diferente, en realidad mi TableView estaba dentro de scrollview, así que tuve que dar la restricción de altura como 0.
Luego, en tiempo de ejecución hice los siguientes cambios,
fuente
Como una extensión de la respuesta de Anooj VM, sugiero lo siguiente para actualizar el tamaño del contenido solo cuando cambie.
Este enfoque también deshabilita el desplazamiento correctamente y admite listas más grandes y rotación . No hay necesidad de dispatch_async porque los cambios de contentSize se envían en el hilo principal.
fuente
versión objc de Musa almatri
fuente
Puedes probar esta costumbre
AGTableView
Para establecer una restricción de altura de TableView usando el guión gráfico o mediante programación. (Esta clase busca automáticamente una restricción de altura y establece la altura de la vista de contenido a la altura de la vista de su tabla).
Nota Si hay algún problema para establecer una altura, entonces
yourTableView.layoutSubviews()
.fuente
Basado en la respuesta de fl034 . Pero para los usuarios de Xamarin.iOS :
fuente
Mi implementación de Swift 5 es establecer la restricción de altura de tableView al tamaño de su contenido (
contentSize.height
). Este método supone que está utilizando el diseño automático. Este código debe colocarse dentro delcellForRowAt
método tableView.fuente
Si desea que su tabla sea dinámica, necesitará usar una solución basada en el contenido de la tabla como se detalla anteriormente. Si simplemente desea mostrar una tabla más pequeña, puede usar una vista de contenedor e incrustar un UITableViewController en ella; el UITableView cambiará de tamaño según el tamaño del contenedor.
Esto evita muchos cálculos y llamadas al diseño.
fuente
above
porque las respuestas podrían barajarse.Solución de Mu para esto en Swift 3 : llame a este método en
viewDidAppear
fuente