ios - sketch - Cómo obtener UIView de tamaño real con autolayout
swift auto layout programmatically (8)
Antes de "obtener el código de tamaño real", inserte el siguiente código:
[view setNeedsLayout];
[view layoutIfNeeded];
Soy un nuevo desarrollador de iOS.
Yo uso el diseño automático.
Tengo un problema. No puedo obtener el tamaño real de UIView después de restricciones.
Ejemplo, cuando quiero obtener el tamaño de UIView
con restricción
self.container.frame.size.height
Siempre devolverá 550 para todo el tamaño del dispositivo. Pero puedo ver que tiene un tamaño de diferencia cuando lo ejecuto en un dispositivo de diferencia.
Gracias
Dado que todo el mundo asume que el acceso se realiza a través de UIViewController
y no dentro de una subclase UIView
, las respuestas no son realmente útiles. La forma correcta de obtener el tamaño correcto de una subclase UIView
es en layoutSubviews
.
El mejor momento es durante viewDidLayoutSubviews
porque sucede antes de viewDidAppear
por lo que aún puede hacer algunas modificaciones antes de que se muestre la vista.
Esto es impresionante
Si desea obtener el marco sin utilizar el método de subvisiones de diseño durante el uso de reproducción automática, use este:
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"View frame: %@", NSStringFromCGRect(view.frame));
})
La solución más sencilla es ejecutar ese código en -viewDidAppear:
(después de que se haya ejecutado el autolayout).
Parece que - (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize;
es lo que buscas:
Valor de retorno
El tamaño de la vista que satisface las restricciones que mantiene.Discusión
Determina el mejor tamaño de la vista considerando todas las restricciones que tiene y las de sus subvistas.
Simplemente puedes usar el método UIView
intrinsicContentSize
que puede leer sobre https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/intrinsicContentSize
[ver layoutIfNeed] sálvame.
Utilice este método para forzar el diseño de subvistas antes de dibujar. Usando la vista que recibe el mensaje como la vista raíz, este método establece el subárbol de vista comenzando en la raíz.
Después de invocar este método, puedo obtener el tamaño real de la vista personalizada en xib. Muchas gracias a @Allen y al autor.