2011-09-27 6 views
38

Tengo una UIView personalizada que tiene un marco dedicado y establecido manualmente para la orientación horizontal y vertical, ya que el encoder automático de Mascaras simplemente no funciona en mi caso.Cómo forzar el diseño. Presentaciones de UIView.

he de poner esto en el marco de:

- (void)viewWillAppear:(BOOL)animated 

y funciona como se esperaba.

Mi problema ahora es que mi UIView tiene además subvistas que también tienen una posición dedicada para retrato/paisaje.

coloco estos subvistas en:

- (void)layoutSubviews 

Si ahora les dejo mi viewController en por ejemplo, orientación vertical, girar al paisaje en otra viewController y luego volver a esta vista Controlador Veo que mi vista se redimensionó correctamente, pero las subvistas de mi vista, que se colocan en layoutSubviews no se reposicionan aún, pero se cambian de tamaño de forma animada después la vista ya apareció.

nada hago en viewDidAppear y ya intentado llamar

- (void)layoutIfNeeded 

Así como:

- (void)setNeedsLayout 

En viewWillAppear, pero no parece que cambiar nada.

¿Alguna idea de lo que estoy haciendo mal?

Gracias.

Respuesta

76

Tuve un problema similar hoy. Lo resuelto por primera llamando

  • -setNeedsLayout: Establecer la bandera que la vista necesita presentación, y después de llamar
  • -layoutIfNeeded: Comprobar la bandera inmediatamente y - ya que se ha establecido manualmente antes - como layoutSubviews resultado se llama.

no sabemos si esta es la mejor manera, pero funciona;)

+1

este método parece funcionar mejor que simplemente llamar a self.view.layoutSubviews() –

+0

Llamar a layoutSubviews usará todas las restricciones que haya configurado para organizar las subvistas. Si lo que estás haciendo no usa restricciones, tendrás que configurarNeedsLayout y luego layoutIfNeeded para forzar una actualización de diseño inmediatamente. – Toby

5

Yo sugeriría establecer el marco inicial en viewDidLoad a continuación, cambiar el marco de vista de los cambios de orientación en

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

No es necesario ningún animaciones explícitas en layoutSubviews (no estoy seguro si tenía ninguna, pero sonaba me gusta) ya que cualquier cambio de marco se sincronizará con la animación de rotación.

Cuando está fuera de la pantalla, la orientación debe seguir girando, por lo que sus vistas deben colocarse correctamente cuando vuelva a aparecer en la pantalla.

También recomiendo ver WWDC 2010 Session 123 "Creación de una interfaz de usuario impulsada por la animación" que trata este tema con mucho más detalle.

+0

que utilizo para hacer girar willAnimateRotationToInterfaceOrientation mis puntos de vista, mientras que en la pantalla, y funciona muy bien. Tampoco tengo una animación explícita en layoutSubviews, ese es el problema. No animo las vistas explícitamente, aún así animan. "Cuando está fuera de la pantalla, la orientación debería girarse" ... ¿en serio? nunca funcionó para mí, siempre tuve que reposicionar en viewWillAppear. Gracias por el consejo con la sesión, sin embargo, veremos esta sesión lo antes posible. – myell0w

-1

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 al setNeedsDisplay en la vista particular, lo cual hice en mi caso y funcionó perfectamente.

+0

Esto ocasiona que se llame al método 'drawRect:'. –

2

En SWIFT 3 @iOS 10.1

override func viewWillAppear(animated: Bool){ 

    //Doesn`t neeed to call super to work 
    view.setNeedsLayout() 
} 

carreras perfectas

Cuestiones relacionadas