2010-01-22 10 views
5

Me he dado cuenta de que estoy recibiendo una orientación muy intermitente en mi dispositivo & el simulador.Orientación muy intermitente en el dispositivo y el simulador

Tengo un controlador de vista modal que presento, y eso es lo único en mi aplicación que admite la rotación.

Si abro la aplicación en vertical sin mover el dispositivo, abra el VC modal y luego gire el dispositivo, generalmente funciona. Sin embargo, a veces, si abro la aplicación que sostiene el dispositivo en horizontal, luego gire a vertical, inicie el VC y luego gire el dispositivo, no se produce rotación. Parece muy intermitente. A veces, si abro la aplicación en modo retrato y luego abro el VC y giro el dispositivo, no pasa nada, y hasta que lo dejé y lo reinicié no se produce ninguna orientación en la aplicación.

¡Es extraño porque el 50% de las veces funciona! Cada vez que lo ejecuto a través de Xcode y establezco puntos de interrupción en shouldAutorotateToInterfaceOrientation ¡siempre funciona!

¿Alguien ha tenido esto o sabe lo que está pasando?

+0

No hay idea específica de lo que está mal, pero pensé que me preguntaría lo que siempre me pregunto cuando ocurre algo extraño en la interfaz de usuario: "¿Llamas a algo en UIKit fuera del hilo principal?" – lawrence

+0

Gracias por el comentario. No, estoy seguro de que no estoy haciendo eso. Es todo muy desconcertante. –

+0

¿Este comportamiento solo ocurre en tu aplicación o también lo ves en otras aplicaciones? – Jasarien

Respuesta

-1

Incluso si intenta iniciar su aplicación en horizontal, su teléfono la ejecutará en vertical y luego irá al paisaje dependiendo de la posición de su teléfono.

No sé qué código está utilizando para lograr esto. Debajo está uno que está tomado de los fragmentos de código de Apple. Vea si esto puede ayudar.

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) 
interfaceOrientation duration:(NSTimeInterval)duration {  
    if (interfaceOrientation == UIInterfaceOrientationPortrait) 
    { 
     self.view = self.portrait; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
    { 
     self.view = self.landscape; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    { 
     self.view = self.portrait; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    { 
     self.view = self.landscape; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = 
     CGAffineTransformMakeRotation(degreesToRadian(90)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 
    } 
} 
+0

Gracias por la respuesta. Esto parece ser un código para intercambiar entre dos vistas de retrato y paisaje separadas. Simplemente estoy permitiendo la rotación de una sola vista, simplemente devolviendo SÍ en el método shouldAutorotateToInterfaceOrientation. –

0

he tenido problemas similares conseguir la auto rotación para que funcione correctamente para los controladores de vista cuyos controladores de vista padre no autorotate, aunque la mayor parte de mi experiencia ha relacionado con disputas UINavigationController en contraposición a los controladores de vista modal. Aún así, recomiendo probar lo siguiente:

  1. presentModalViewController Llamar: en el controlador de vista de nivel superior de la jerarquía en lugar de un viewController más profundo.

  2. Si eso no resuelve, intente crear subclases de su controlador de vista de nivel superior, y anulando su shouldAutorotateToInterfaceOrientation: a ser algo como esto:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    if (self.modalViewController) { 
     return [self.modalViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
    } 
    return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
} 
1

Puesto que usted ha mencionado "intermitente", Diría que tiene algo que ver con lo que haces después de la rotación.

Para encontrar el error, sugiero eliminar cualquier código después de que ocurra la rotación. Comente cualquier actividad de red u operaciones de OpenGL. También podría ayudar a cerrar XCode y volver a abrirlo.

Si nada ayuda, haría un nuevo proyecto y comenzaría a mover los archivos uno por uno y probarlos.

+0

Sí, definitivamente creo que algo extraño está sucediendo. Planeo quitar el código hasta que esté funcionando y diseccionarlo de esa manera. Gracias por la sugerencia. –

0

Does llamando

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

al mostrar su rotación conscientes vista ayuda? (y posiblemente lo apague de nuevo cuando lo descarta?)

La otra cosa que buscaría son las llamadas sospechosas a [UIWindow makeKeyWindow] o [UIResponder becomeFirstResponder].

También me suscribiría para los eventos UIDeviceOrientationDidChangeNotification y me aseguraré de que la vista modal reciba una llamada al [UIViewController shouldAutorotateToInterfaceOrientation:] por cada evento que reciba.

+0

Gracias por la ayuda. ¡Probaré las sugerencias y te llamaré! –

0

¡Finalmente descubrí cuál era el problema!

Resulta que solo el primer UIView que agregue a su UIWindow se le preguntará si desea rotar o no. Cualquier vista posterior no recibe este mensaje. Mi aplicación estaba usando otra vista para animar lejos del Default.png que se muestra en el inicio, ¡y esto se agregó primero a la ventana!

Cuestiones relacionadas