ios iphone uiview uiviewcontroller layoutsubviews

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;)