2011-03-03 10 views
5

Mi diseño actual requiere una animación genial entre las vistas vertical y horizontal de los datos. La representación de datos es bastante compleja, por lo que entre los elementos gráficos y de datos, probablemente haya alrededor de 30 botones y etiquetas en la pantalla a la vez. Creé una interfaz muy bien diseñada ... ahora estoy diseñando los elementos para la vista del paisaje. La única manera que he encontrado para hacer esto hasta ahora es establecer realmente la vista horizontal en el código, por ejemplo:¿Existe algún método para * diseñar visualmente * vistas gemelas (paisaje + retrato) en Interface Builder?

-(void) positionViews { 
    UIInterfaceOrientation destOrientation = self.interfaceOrientation; 
    if (destOrientation == UIInterfaceOrientationPortrait || destOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     //---if rotating into PORTRAIT mode 
     timeBGbox.frame = CGRectMake(14, 88, 134, 14); 
     targetTime.frame = CGRectMake(0, 99, 150, 29); 
     energyBGbox.frame = CGRectMake(156, 88, 68, 14); 
     targetEnergy.frame = CGRectMake(154, 99, 70, 29); 
     speedBGbox.frame = CGRectMake(234, 88, 68, 14); 
     targetSpeed.frame = CGRectMake(226, 99, 48, 29); 
     speedLabel.frame = CGRectMake(264, 99, 40, 36); 
    } else { 
     //---if rotating to LANDSCAPE mode 
     timeBGbox.frame = CGRectMake(156, 12, 152, 14); 
     targetTime.frame = CGRectMake(160, 23, 150, 29); 
     energyBGbox.frame = CGRectMake(156, 50, 68, 14); 
     targetEnergy.frame = CGRectMake(154, 61, 70, 29); 
     speedBGbox.frame = CGRectMake(234, 50, 74, 14); 
     targetSpeed.frame = CGRectMake(228, 61, 48, 29); 
     speedLabel.frame = CGRectMake(269, 61, 40, 36); 
    } 
} 

Este es un proceso laborioso, teniendo muchas pruebas para llevar a cabo lo que podría hacer visualmente segundos en IB. Actualmente, cuando alterno entre las vistas en IB y muevo los elementos manualmente en modo horizontal, al volver a la posición vertical, están en el lugar equivocado. He usado "muelles y puntales" de la forma más creativa posible, pero la mayoría de mis elementos necesitan una colocación manual precisa más allá del dominio de AutoSizing.

Mi pregunta es: ¿Hay un modo de alternar dentro de IB que permite desarrollar dos diseños gráficos de una vista usando las herramientas de diseño visual, o es el código numérico la única manera?

Respuesta

3

Puede crear un número arbitrario de vistas en su archivo de punta. Puede llamar a una de ellas "vista de retrato" (por ejemplo, la que también está conectada a la salida de "vista" del propietario del archivo), y una de ellas es "vista de paisaje". Definir a ambos como puntos de venta en su clase UIViewController:

@property (nonatomic, retain) IBOutlet UIView *portraitView; 
@property (nonatomic, retain) IBOutlet UIView *landscapeView; 

exponer los campos de IB como desee. El truco entonces es que es necesario duplicar los puntos de venta en el archivo de cabecera:

@property (nonatomic, retain) IBOutlet UIView *myLabel_portrait; 
@property (nonatomic, retain) IBOutlet UIView *myLabel_landscape; 

y en su código que necesita para mantener las dos versiones hasta la fecha. Lo mejor es simplemente actualizarlos cuando actualice uno de ellos.

A continuación, el código para autorotate es muy fácil, basta con:

if (switchingToPortrait) 
    self.view = self.portraitView; 
else 
    self.view = self.landscapeView; 
+2

+1. Esto tiene el inconveniente de que los elementos no se reorganizan en las nuevas posiciones con una animación, solo se puede animar la transición entre las vistas completas. – zoul

+1

Haría eso con una tercera vista, y en el código colocaré todos los elementos en la vista giratoria "temporal" usando los marcos de la vista de retrato, luego animaré las posiciones a la de la vista de paisaje. Todavía usa la técnica que describo, simplemente se expande. Aún puede diseñar el modo horizontal en IB para mayor comodidad. – Bogatyr

+0

gracias Bogatyr ... por aclaración: ¿estás diciendo que cada etiqueta y botón que necesito para abordar necesita una versión _portrait y _landscape? Entonces, básicamente, a lo largo de mi código, ¿actualizaré 2 vistas simultáneamente? – AcroYogi

0

AFAIK no hay forma de hacerlo en Interface Builder. Como las vistas se instancian desde el archivo de punta, de todos modos terminarías con dos instancias.

Como se indica en los documentos del desarrollador, puede usar layoutSubviews, o simplemente usar un método personalizado en su controlador de vista como el que tiene aquí.

1

Lo mejor que puedo pensar es tener dos vistas, y cambiarlas en didRotateFromInterfaceOrientation:.

0

crear una vista horizontal y vertical en el constructor de interfaces. Para cada orientación, coloque sus elementos tal como los quiere. Cuando esté satisfecho con la apariencia, copie las coordenadas en su método "PositionViews".

Cuestiones relacionadas