Ahora, Interface Builder permite al usuario cambiar dinámicamente el tamaño de cada controlador de vista en el guión gráfico, para simular el tamaño de un determinado dispositivo.
Antes de esta funcionalidad, el usuario debe configurar manualmente el tamaño de cada controlador de vista. Entonces, el controlador de vista se guardó con un cierto tamaño, que se usó initWithCoder
para establecer el marco inicial.
Ahora, parece que initWithCoder
no use el tamaño definido en el guión gráfico y defina un tamaño de 1000x1000 px para la vista del controlador de vista y todas sus subvistas.
Esto no es un problema, porque las vistas siempre deben usar cualquiera de estas soluciones de diseño:
autolayout, y todas las restricciones diseñarán correctamente sus vistas
autoresizingMask, que diseñará cada vista que no tenga ninguna restricción adjunta ( tenga en cuenta que el diseño automático y las restricciones de margen ahora son compatibles en la misma vista \ o /! )
Pero esto es un problema para todas las cosas de diseño relacionadas con la capa de vista cornerRadius
, ya que ni el diseño automático ni la máscara de tamaño automático se aplican a las propiedades de la capa.
Para responder a este problema, la forma más común es utilizarlo viewDidLayoutSubviews
si está en el controlador o layoutSubview
si está en una vista. En este punto (no olvide llamar a sus super
métodos relativos), ¡está bastante seguro de que se ha hecho todo el diseño!
¿Bastante seguro? Hum ... no del todo, he comentado, y es por eso que hice esta pregunta, en algunos casos la vista todavía tiene su tamaño de 1000x1000 en este método. Creo que no hay respuesta a mi propia pregunta. Para dar la máxima información al respecto:
1- ¡ocurre solo al colocar celdas! En las subclases UITableViewCell
& UICollectionViewCell
, layoutSubview
no se llamará después de que las subvistas estén correctamente distribuidas.
2- Como comentó @EugenDimboiu (por favor, vote a favor de su respuesta si es útil para usted), llamar [myView layoutIfNeeded]
a la subvista no diseñada la distribuirá correctamente justo a tiempo.
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel); // 1000x1000 size
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel); // normal size
}
3- En mi opinión, esto es definitivamente un error. Lo envié al radar (id 28562874).
PD: no soy nativo de inglés, así que siéntete libre de editar mi publicación si se debe corregir mi gramática;)
PS2: Si tiene una solución mejor, no dude en escribir otra respuesta. Moveré la respuesta aceptada.