tipo tamaño para letra cambiar aplicacion ajustar acomodar ios uiscrollview autolayout uicontainerview

ios - para - ajustar tamaño dashboard tableau



Dimensionar una vista de contenedor con un controlador de tamaño dinámico dentro de una vista de desplazamiento (4)

Basándose en la gran solución de @ Mischa para este problema, si el contenedor incrusta un UITableView de tamaño dinámico, entonces debe considerar anular su tamaño de contenido y Tamaño de contenido intrinsicContentSize , así como establecer translatesAutoresizingMaskIntoConstraints = false según la respuesta aceptada.

Cuando la vista principal se carga y configura la vista de contenedor, se deduce que la altura intrínseca de cada uno de los UITableViewCells es 0, por lo tanto, el método UITableViewDelegate de:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

No será llamado. Esto hace que UITableView parezca que no tiene contenido.

Anular el tamaño de contenido intrínseco para devolver el tamaño de contenido real significa que la vista de tabla se muestra con el tamaño que requiere su contenido.

Un gran article de Emilio Peláez profundiza en este tema.

Estoy tratando de crear una vista de contenedor, con un controlador que tenga una altura dinámica, dentro de un UIScrollView y dimensionarlo automáticamente usando el diseño automático.

El controlador de vista A es la vista de desplazamiento, que incluye la vista de contenedor, junto con más contenido a continuación.

El controlador de vista B es el controlador de vista que quiero tener un tamaño dinámico y que todo el contenido se muestre en toda su altura en la vista de desplazamiento del controlador de vista A.

Tengo algunos problemas para que el tamaño dinámico de B establezca automáticamente el tamaño de la Vista de contenedor en A. Sin embargo, si configuro una restricción de altura en la Vista de contenedor en A ,

Sería la salida esperada si View Controller B también tuviera una altura de 250. También funciona bien para la altura 1000, por lo que yo sé, todas las restricciones de diseño automático están configuradas correctamente. Desafortunadamente, dado que la altura en realidad debería ser dinámica, me gustaría evitar establecer una restricción de altura.

No estoy seguro de si hay alguna configuración para el controlador de vista que BI puede configurar para que actualice automáticamente su tamaño en función de su contenido, o si hay algún otro truco que me haya perdido. Cualquier ayuda sería muy apreciada!

¿Hay alguna forma de dimensionar la Vista de contenedor en A de acuerdo con el tamaño del Controlador de vista B sin establecer una restricción de altura?


De la respuesta de @Mischa pude hacer que la altura de un containerView sea dinámica dependiendo de su contenido haciendo esto:

En el viewController del containerView escriba:

override func loadView() { super.loadView() view.translatesAutoresizingMaskIntoConstraints = false }

Y teniendo cuidado de que las restricciones verticales en IB estén establecidas. Al hacer esto, no necesita establecer view.translatesAutoresizingMaskIntoConstraints = false desde fuera del controlador de vista.

En mi caso, estaba tratando de cambiar el tamaño del contenedor a una tableView dentro de viewController. Debido a que tableView tiene una altura flexible dependiendo de su supervista (por lo que todo está bien para IB), completé las restricciones verticales en el código haciendo esto:

@IBOutlet private var tableView: UITableView! { didSet { tableView.addConstraint(tableViewHeight) } } private lazy var tableViewHeight: NSLayoutConstraint = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 0)

Y luego observe la altura contentSize de la vista de tabla y ajuste la constante de la restricción tableViewHeight mediante programación cuando sea necesario.


Sí, lo hay. Logré lograr ese tipo de comportamiento en uno de mis propios proyectos.

Todo lo que tiene que hacer es decirle al sistema que no debe agregar restricciones que imiten el conjunto de marcos fijos para su vista raíz en Interface Builder. El mejor lugar para hacer esto es en su controlador de vista de contenedor cuando se activa su segue de inserción:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // You might want to check if this is your embed segue here // in case there are other segues triggered from this view controller. segue.destinationViewController.view.translatesAutoresizingMaskIntoConstraints = NO; }

Importante:

Debe asegurarse de que la vista que carga en el contenedor está restringida de arriba a abajo y debe establecer la prioridad de una de las restricciones verticales en un valor inferior a 1000. (Es una buena práctica usar siempre la restricción inferior para esto.) Esto es necesario porque de lo contrario Interface Builder se quejará, con una buena razón:

En tiempo de diseño, su vista raíz tiene un tamaño fijo (altura). Ahora, si todas sus subvistas tienen una altura fija y están conectadas con restricciones fijas que tienen la misma prioridad, es imposible cumplir con todos estos requisitos a menos que la altura de su vista de raíz fija coincida exactamente con la altura total de sus subvistas y las restricciones verticales. Si baja la prioridad de una de las restricciones a 999 Interface Builder sabe qué restricción romper. Sin embargo, en tiempo de ejecución, cuando la propiedad translatesAutoresizingMaskIntoConstraints se establece como se indicó anteriormente, ya no hay un marco fijo para su vista raíz y el sistema usará su restricción de prioridad 999.


Swift 4, Xcode 9

La respuesta aceptada sola no resolvió el problema para mí.

Mi jerarquía: ScrollView -> Vista de contenido (UIView) -> Vistas | Vista de contenedor | Otras vistas.

Tuve que agregar las siguientes restricciones para hacer que tanto el ScrollView como el Contenedor se ajusten dinámicamente:

  1. ScrollView : Superior, Inferior, Principal, Final a Supervisión (Áreas seguras)
  2. Vista de contenido : Superior, Inferior, Principal, Final, Igual ancho para ScrollView, pero también con Alturas iguales (restricción con una prioridad inferior: 250) .
  3. Vistas : restricciones normales de diseño automático.
  4. Vista de contenedor : vista superior, inferior a vecino, líder y posterior al área segura.
  5. VC incrustado de la vista de contenedor : ¡Toda restricción conectada verticalmente con la restricción inferior establecida en una prioridad más baja, pero más grande que la de igual altura de la vista de contenido! En este caso, una prioridad de 500 hizo el truco.
  6. Establezca view.translatesAutoresizingMaskIntoConstraints = false en prepareForSegue() o en loadView() como se indica en otras respuestas.

Ahora tengo una vista de contenedor ajustable dinámicamente dentro de una vista de desplazamiento de cambio de tamaño automático.