¿Cuál es la forma correcta de informar el tamaño deseado para la subclass UIView?

Estoy subclassando UIView y no puedo encontrar una forma correcta de solicitar / reportar el tamaño deseado. Esperaba que systemLayoutSizeFittingSize hiciera el truco, pero nunca se llama. El layout es simple: pincho la parte superior y el frente de mi vista y el límite de la parte posterior y la parte inferior para ser menor o igual a la vista de nivel superior. Entre todas las funciones de dimensionamiento, solo se llama a intrinsicContentSize , pero esa no es muy útil.

 import Foundation import UIKit class StatsView: UIView { override func drawRect(rect: CGRect) { let context=UIGraphicsGetCurrentContext()! CGContextSetRGBFillColor(context, 0, 0, 1, 1) CGContextFillRect(context, rect) } override func sizeThatFits(size: CGSize) -> CGSize { print("Called sizeThatFits with \(size)") if(size.width>350) { return CGSize(width: 350,height: 50) } else { return CGSize(width: 50,height: 100) } } override func systemLayoutSizeFittingSize(size: CGSize) -> CGSize { print("Called systemLayoutSizeFittingSize with \(size)") return super.systemLayoutSizeFittingSize(size) } override func systemLayoutSizeFittingSize(size: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize { print("Called systemLayoutSizeFittingSize with \(size)") if(size.width>350) { return CGSize(width: 350,height: 50) } else { return CGSize(width: 50,height: 100) } } override func intrinsicContentSize() -> CGSize { super.intrinsicContentSize() print("Called intrinsicContentSize") return CGSize(width: 10,height: 50) } } 

¿Cuál es la forma correcta de hacerlo?

Actualización Quiero que mi vista tenga algo de información, no solo un rectángulo azul. Hay un ancho "óptimo", pero si la vista no puede tener tanto de su padre, puede compensar reorganizando la información para usar más altura. Entonces, informar valores constantes de intrinsicContentSize no se ajusta a mis necesidades.

Utiliza intrinsicContentSize para informar el tamaño deseado de su vista en function de su contenido. Este valor puede cambiar a medida que cambian los contenidos, pero debe llamar a invalidateIntrinsicContentSize cuando lo haga.

Este contenidoContinSizeSize funciona junto con contentHuggingPriority , contentCompressionResistancePriority y las otras restricciones de layout en la vista de supervisión para determinar el tamaño de layout real.

En su caso, parece que desea informar un tamaño ideal basado en el contenido de su vista, cambiar el tamaño e invalidarlo si el contenido cambia, y usar restricciones de layout con vistas de hermanos y la vista principal para comprimir (o resistir) según sea necesario.

Tenga en count que, en el entorno de layout automático, systemLayoutSizeFittingSize no llamará ni siquiera cambiará el layout. Es un método para calcular el tamaño de una vista después de que la vista finalizó el layout.

El tamaño de contenido intrínseco solo se refiere a los datos que están en la vista misma, no en otras vistas. Recuerde que también puede establecer restricciones constantes de ancho o alto en cualquier vista, y no necesita anular instrinsicContentSize si estas dimensiones no van a cambiar con el cambio de contenido de vista

La vista actualizará su tamaño de contenido si hay alguna actualización de su restricción que ocurre con el método - (void)updateConstraints que significa que usted puede anular este método para observar los cambios de sus restricciones. Como quiere reorganizar las vistas en ciertas condiciones de ancho, la mejor práctica es colocar este método - (void)layoutSubviews , que llamará a los cambios del marco de la vista.

 - (void)layoutSubviews { [super layoutSubviews]; // do your view arrangement based on width // apple custom constraint here }