2011-09-11 8 views
5

Mis subvistas tienen una disposición diferente en orientación vertical y horizontal. El diseño se basa en el marco de la supervista, y no es trivial (no se puede lograr utilizando resortes de ajuste y puntales).Obtención del marco correcto en el interior willRotateToInterfaceOrientation

El problema es que si estoy cambiando el marco de las subViews durante willRotateToInterfaceOrientation, la animación es correcta, pero el marco es el superView sigue siendo el marco de la orientación anterior.

Si estoy cambiando las subViews durante didRotateFromInterfaceOrientation, el marco es el superView es de hecho el correcto, pero el cambio de marco solo ocurre después de la animación giratoria y no se ve bien.

¿Cuál es la forma correcta de cambiar los marcos de las subViews al cambiar de orientación?

+0

Resolví este problema escribiendo un método en cada subvista que manejará la pieza de cambio de fotograma. Estableceré el marco de la vista principal en willRotateToInterfaceOrientation y luego generaré un nuevo cuadro similar usando la función CGFrameMake y lo pasaré a cada subView. Me funcionó ... comprueba si es útil. – Mohammad

+0

No entendí bien tu respuesta. En willRotateToInterface todavía no conozco el marco de la supervista porque la rotación aún no ha sucedido. Este es el problema. – adamsiton

+0

No uso el marco de superView para rotar subvistas. Calculo lo que sería valioso para el marco de superView después de la rotación y luego realizo un nuevo CGRect basado en el cálculo y luego lo transfiero al método handleOrientation de cada subView. Si no puede calcular lo que sería valioso para el marco de superView después de la rotación, lo anterior no le servirá. – Mohammad

Respuesta

3

Creo que puede intentar anular layoutSubviews. Allí puede diseñar las subvistas de acuerdo con la orientación actual, sin preocuparse por will/did RotateFromInterfaceOrientation. Se llama a layoutSubviews cada vez que se presentan las vistas. Esto te ayudará a sincronizar los cambios de tu fotograma con la animación.

HTH,

Akshay

+0

Pero significará que estoy moviendo toda la lógica de diseño a la Vista y no al ViewController. Actualmente estoy configurando el diseño de la subvista de acuerdo con las propiedades de UIViewController. Mover la lógica a UIView significa que tengo que subclasificar UIView y mover todos los parámetros a esta subclase personalizada. No estoy seguro de que esta lógica deba estar en UIView y no en UIVIewController, pero lo intentaré. – adamsiton

4

Esta función se puede utilizar para lo que necesita porque el marco de la vista ha cambiado desde la rotación y que no se cala la animación personalizada.

-(void)willAnimateRotationToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    float width = UIInterfaceOrientationIsPortrait(toInterfaceOrientation) ? [[UIScreen mainScreen] applicationFrame].size.width : [[UIScreen mainScreen] applicationFrame].size.height; 
//do something with the width now 
//or you can get the height the same way 
} 
Cuestiones relacionadas