ios - Cómo forzar layoutSubviews de UIView.
iphone uiviewcontroller (4)
Tengo una UIView personalizada que tiene un marco dedicado y de configuración manual para la orientación horizontal y vertical, ya que el aumento de tamaño de las máscaras simplemente no funciona en mi caso.
Configuré este marco:
- (void)viewWillAppear:(BOOL)animated
Y funciona como se esperaba
Mi problema ahora es que mi UIView tiene subvistas que también tienen una posición dedicada para retrato / paisaje.
Posiciono estas subvistas en:
- (void)layoutSubviews
Si ahora dejo mi viewController en, por ejemplo , orientación vertical, gire hacia el paisaje en otro viewController y vuelva a este viewController veo que mi vista se redimensionó correctamente, pero las subvistas de mi vista, que se posicionan en layoutSubviews, no se reposicionan aún, pero se cambian de tamaño de una manera animada después de que la vista ya apareció.
No hago nada en viewDidAppear y ya intenté llamar
- (void)layoutIfNeeded
Tanto como:
- (void)setNeedsLayout
En viewWillAppear, pero no parece cambiar nada.
¿Alguna idea de lo que estoy haciendo mal?
Gracias.
En swift 3 @iOS 10.1
override func viewWillAppear(animated: Bool){
//Doesn`t neeed to call super to work
view.setNeedsLayout()
}
funciona perfecto
Para mí, lo que funcionó es [self.view setNeedsDisplay]
. Esto llama a volver a dibujar en toda la vista. También puede volver a dibujar una vista seleccionada llamando a setNeedsDisplay
en la vista particular, lo cual hice en mi caso y funcionó perfectamente.
Sugeriría establecer el marco inicial en viewDidLoad y luego cambiar el marco de vista para los cambios de orientación en
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
No necesita ninguna animación explícita en layoutSubviews (no estoy seguro de si tenía alguna, pero sonaba como eso) ya que cualquier cambio de marco se sincronizará con la animación de rotación.
Cuando está fuera de la pantalla, la orientación aún debe girarse, por lo que sus vistas deben estar posicionadas correctamente cuando vuelva a aparecer en la pantalla.
También recomiendo ver WWDC 2010 Session 123 "Construyendo IU impulsada por la animación", que trata este tema con mucho más detalle.
Tuve un problema similar hoy. Lo solucioné llamando primero
-
-setNeedsLayout
: establece el-setNeedsLayout
que la vista necesita el diseño y luego llama -
-layoutIfNeeded
: verifique el indicador de inmediato y, como se configuró manualmente antes, se llamará el resultado layoutSubviews.
No sé si esta es la mejor manera, pero funciona;)