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
Actualización de Swift 3 : diseño automático más sencillo: restricciones de codificación en iOS 9
Lea Cómo escribir un control personalizado para iOS 8 usando Swift y Auto Layout para ver un ejemplo de cómo esto se hace correctamente en contexto.
- El hecho de que haya configurado el tamaño del contenido intrínseco en su vista personalizada no significa que funcionará como espera. Lea la documentación sobre cómo usarlo, prestando especial atención a la compresión de contenido y la resistencia a la compresión .
- Gracias también a estas preguntas y respuestas por ponerme en el camino correcto: ¿Cómo puedo agregar relleno al tamaño del contenido intrínseco de UILabel?
- Gracias también a este artículo y la documentation para obtener ayuda con
invalidateIntrinsicContentSize()
.