ios swift custom-controls intrinsic-content-size

ios - ¿Cómo configurar el tamaño del contenido intrínseco de una vista personalizada en Swift?



custom-controls intrinsic-content-size (2)

Fondo

Estoy haciendo una etiqueta vertical para usar con la escritura mongol tradicional. Antes solo estaba rotando una UILabel pero había algunos problemas de rendimiento y otras complicaciones con esto. Ahora estoy trabajando en hacer una etiqueta desde cero. Sin embargo, necesito la etiqueta vertical para indicar el diseño automático cuando se ajusta su altura (según la longitud de la cadena).

Lo que he leído

Leí el tamaño del contenido intrínseco y las vistas con la documentación del tamaño del contenido intrínseco . Sin embargo, se trataba más de cómo usarlo y no de cómo definirlo en una vista personalizada.

La búsqueda del "tamaño del contenido intrínseco de ios para una vista personalizada" solo me da

en desbordamiento de pila. Esta pregunta en particular ni siquiera necesitaba un tamaño de contenido intrínseco porque su vista era solo un conjunto de vistas estándar.

Lo que estoy tratando

Lo que estoy tratando es mi respuesta a continuación. Estoy agregando este par de preguntas y respuestas para que a otras personas no les lleve mucho tiempo encontrar la respuesta que me llevó con las palabras clave de búsqueda que usé.


Basado en la excelente respuesta de arriba,

Ejemplo de una "vista con altura intrínseca" ...

@IBDesignable class HView: UIView { @IBInspectable var height: CGFloat = 100.0 override var intrinsicContentSize: CGSize { return CGSize(width: 99, height: height) // if using in, say, a vertical stack view, the width is ignored } }

que se puede establecer como un inspeccionable

Dado que tiene una altura intrínseca, puede (por ejemplo) insertarse inmediatamente en una vista de pila en el código:

stack?.insertArrangedSubview(HView(), at: 3)

En cambio, si fuera una vista normal sin altura intrínseca, tendría que agregar un ancla de altura o se estrellaría:

let v:UIView = HView() v.heightAnchor.constraint(equalToConstant: 100).isActive = true stack?.insertArrangedSubview(v, at: 3)

Tenga en cuenta que en el caso especial de una vista de pila:

  • solo tiene que preocuparse por un anclaje único (para la vista de pila vertical, la altura; para el ancho horizontal)

así, el ajuste de la altura intrínseca funciona perfectamente; ya que

  • la altura intrínseca de hecho significa que el anclaje de altura específicamente se establecerá automáticamente si es necesario.

Recordando que en todos los casos normales de una subvista, se necesitan muchos otros anclajes.


La configuración del tamaño del contenido intrínseco de una vista personalizada le permite al diseño automático saber qué tamaño le gustaría tener esa vista. Para configurarlo, debe anular intrinsicContentSize .

override var intrinsicContentSize: CGSize { return CGSize(width: x, height: y) }

Luego llame

invalidateIntrinsicContentSize()

Cada vez que se modifique el tamaño del contenido intrínseco de la vista personalizada y el marco debe actualizarse.

Notas