2009-09-27 7 views
7

Tengo tres ViewControllers configurados para manejar tres vistas. El problema que tengo es que en el simulador la orientación es LandscapeRight (que es lo que quiero), y la primera vista se muestra correctamente en esa vista horizontal, pero cuando me muevo a la segunda y tercera vista, aparecen giró 90 grados en sentido antihorario con la esquina superior izquierda de la vista en la esquina inferior izquierda de la pantalla del teléfono. He estado tratando de depurar esto durante unos días y el más cercano que he estado de una pista que está trazando la siguiente manera:Solo la primera vista agregada de UIView addSubview muestra la orientación correcta

El siguiente es en applicationDidFinishLaunching mi aplicación de delegado:

NSLog(@"1"); 
[window addSubview:welcomeController.view]; 
NSLog(@"2"); 
[window addSubview:goalController.view]; 
NSLog(@"3"); 
[window addSubview:planningController.view]; 
NSLog(@"4"); 

[window bringSubviewToFront:welcomeController.view]; 
NSLog(@"5"); 

cada uno de mis ViewControllers implementar algo similar a lo siguiente (el único cambio es el nombre del controlador de conmutación en la cadena pasada a NSLog):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Return YES for supported orientations 
NSLog(@"called for WelcomeController"); 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

con eso, me sale el siguiente salida en la consola:

a 
called for WelcomeController 
called for WelcomeController 
called for WelcomeController 
called for WelcomeController 
2 
called for GoalController 
3 
called for PlanningController 
4 
5 

Me resulta interesante que shouldAutorotateToInterfaceOrientation se llame 4 veces para la primera vista que se agrega, mientras que las otras dos solo se llaman una vez. Supongo que esto se debe probablemente a que primero tiene que configurarse (y creo que el simulador comienza en modo vertical, por lo que podría estar llamándolo mientras hacía la rotación), pero la correlación me parece un poco sospechosa.

He cambiado el orden para que addSubview se llame primero para el goalController y welcomeController para el segundo. En este caso, es el goalController el que se muestra en la orientación correcta del paisaje (normalmente es el controlador de bienvenida). Esto parece eliminar mis archivos XIB y ViewControllers. No estoy seguro de por qué la primera vista donde se llama addSubview es especial. También intenté usar insertSubview en el índice 0 con los mismos resultados.

Respuesta

0

Tuve un similar issue. No estoy seguro de por qué tampoco. Pero la solución fue invocar esto en cada vista después de la primera:

[planningController.view setFrame: CGRectMake (0, 0, 480, 300)];

y antes -addView. Tengo curiosidad si esto te ayuda. Si no soy el único con este problema y esta solución alternativa, entonces tal vez haya una razón.

+0

Esto no parece haber ayudado mi código. Traté de hacer llamadas tanto para goalController como para planningController antes y después de las correspondientes llamadas addSubview (incluso intenté cambiar las 300 y 480;) Parece que hace la diferencia en algunos puntos porque, en lugar de tener la vista de bienvenida en el fondo de la parte de la pantalla que no está cubierta, es simplemente blanca, así que creo que debe ser algo que se extiende por la pantalla. –

+0

Una cosa que noté de su publicación es que parece tener una vista de tabla que se muestra en modo vertical, dejando la derecha aproximadamente en 1/3 de la página en blanco. Obtengo lo mismo, excepto que mi vista se gira 90 grados, por lo que lo que debería ser la parte superior apunta hacia la izquierda. –

+0

Diseñé todo en IB con la orientación horizontal, que puede ser el motivo por el que las cosas apuntan hacia el lado correcto, pero no ocupan toda la pantalla. Empecé con la ventana principal, con viewControllers y las vistas, todas están en el paisaje. Al igual que usted, si cambio el orden de mis controladores de vista, entonces, el que sea primero, no necesita la llamada a setFrame. – mahboudz

4

Me encontré con el mismo problema, y ​​al parecer agregar las subvistas a un UIWindow no funciona de la manera que esperaba. Logré resolver el problema después de agregar un "dummy" UIViewController que es la ÚNICA subvista en la ventana UI. Después de agregar ese, funciona perfectamente para agregar múltiples subvistas al controlador ficticio, todas con la orientación correcta.

Por lo que el único código en la clase de controlador "ficticio" es la función "shouldAutorotateToInterfaceOrientation". Esto también debería coincidir con la misma función en todas las otras subvistas.

Espero que ayude.

+1

Esto no funciona para mí (en iPad). No soy noobsor, pero esto es muy frustrante. – tobyc

+0

No funciona para mí también ... – Karthik

0

Esto está muy lejos de ser ideal. Pero puede hackear la segunda transformación de vistas para que gire correctamente. Esto funciona para mí porque mi aplicación solo está en modo horizontal. Puede no ser ideal si quieres cambiar la orientación.

[window addSubview:firstController.view]; 
[window addSubview:secondController.view]; 
CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI/2.0); 
[backgroundViewController.view setTransform:rotate]; 
CGRect contentRect = CGRectMake(0, 0, 1024, 768); 
backgroundViewController.view.bounds = contentRect; 
[backgroundViewController.view setCenter:CGPointMake(768/2, 1024/2)]; 

0

creo que tengo una solución para esto que parece funcionar. Agregue una vista y luego elimínela inmediatamente, repita para cada vista y luego agregue las tres. De esta manera:

[window addSubview:welcomeController.view]; 
[welcomeController.view removeFromSuperview]; 
[window addSubview:goalController.view]; 
[goalController.view removeFromSuperview]; 
[window addSubview:planningController.view]; 
[planningController.view removeFromSuperview]; 

[window addSubview:welcomeController.view]; 
[window addSubview:goalController.view]; 
[window addSubview:planningController.view]; 

Parece que funciona, al menos en el simulador.

+0

Esto funciona para mí en el simulador de iPad 4.2, pero no en 3.2 (que desafortunadamente todavía tengo que admitir). –

Cuestiones relacionadas