2010-03-10 15 views
7

Como dice el título. Mi UIViewController no girará sin importar qué. Cuando se carga, se llamará a AuthorAteToInterfaceOrientation pero después de eso no funciona.UIViewController no gira automáticamente

ACTUALIZACIÓN 1:

Es un problema muy, muy extraño. Al menos para mi. Y trataré de explicar todo.

Es una aplicación basada en la navegación. Cada controlador tiene

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ 
    return YES; 
} 

Xcontroller es un hijo de Acontroller y no lo hace auto rotación. Si Xcontroller se convierte en un elemento secundario de Bcontroller, se autoreprobará. Entonces, algo está mal con Acontroller. Pero Acontroller es idéntico (excepto sus datos) a Bcontroller.

¿Qué es incorrecto?

ACTUALIZACIÓN 2:

decidí recrear Acontroller. Y funcionó. Creo que me estaba perdiendo algo estúpido.

+0

¿Cómo implementó '' -shouldAutorotateToInterfaceOrientation: '? – kennytm

+0

- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { return YES; } Si eso es lo que quieres decir :). – looneygrc

Respuesta

15

No estoy seguro de si es la misma razón que su caso. Pero experimenté lo mismo. el shouldAutorotateToInterfaceOrientation solo se llamó una vez al principio. Después de algunas depuraciones graves al separar el código, descubrí que el motivo está en mi método init anulado. que tenía antes:

- (id)initWithAlbum:(PhotoAlbum *)theAlbum { 
    if (self) {  
     self.photoAlbum = theAlbum;  
    } 
    return self; 
} 

Y luego cambié a este

- (id)initWithAlbum:(PhotoAlbum *)theAlbum { 
    if (self = [super init]) {  
     self.photoAlbum = theAlbum;  
    } 
    return self; 
} 

Nota: la única diferencia es añadí [super init] a llamar a la inicialización de los padres. Después de este cambio, la rotación funciona bien y se llama a la opción shouldAutorotateToInterfaceOrientation cada vez que giro la pantalla. Espero que esta ayuda.

+1

Hola DaiLak, me salvaste la vida. Tuve el mismo problema que el tuyo, y había estado luchando con él durante horas. Gracias. –

+0

No funciona para mí –

0
  • (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {return SÍ; } El método anterior si lo usa, podrá llamar a muchas veces si lo desea sin ningún error.
+0

Estoy usando este método. Y solo se llama cuando se carga el controlador. – looneygrc

0

Creo que no hay ningún comportamiento extraño aquí, se llama solo uno que es correcto. No es necesario llamar a más de uno para decidir si el dispositivo debe girar en una dirección o no.

Este método solo pregunta si el dispositivo debe rotar en una dirección o no. Si desea manejar el cambio de orientación, deberá registrarse en la notificación de la UIDeviceDidChangeOrientationNotification y anular el siguiente método:

- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && 
    !isShowingLandscapeView) 
    { 
     [self presentModalViewController:self.landscapeViewController 
          animated:YES]; 
     isShowingLandscapeView = YES; 
    } 
    else if (deviceOrientation == UIDeviceOrientationPortrait && 
      isShowingLandscapeView) 
    { 
     [self dismissModalViewControllerAnimated:YES]; 
     isShowingLandscapeView = NO; 
    } 
} 

Ver más here.

+0

Gracias por su respuesta.Pero no entiendo por qué en mis otros controladores shouldAutorotateToInterfaceOrientation es suficiente para rotarlos. Y para este controlador específico no es suficiente. También en mis otros controladores cada vez que giro el dispositivo se llamará a AuthorAteToInterfaceOrientation. – looneygrc

+0

En otras palabras ... mi controlador debe llamar a shouldAutorotateToInterfaceOrientation cada vez que giro el dispositivo para verificar si la orientación es compatible. Bueno ... mi controlador "problemático" lo llama solo cuando se carga y no cuando el dispositivo gira. – looneygrc

+0

Cuando el dispositivo gira, le pide al controlador que apoye la rotación consultando "shouldAutorotateToInterfaceOrientation:", si la respuesta es sí, llamará a willRotateToInterfaceDuration: duration: para ver si necesita hacer otras modificaciones. –

2

Además, asegúrese de que usted no tiene el bloqueo en la rotación. Pasé una buena hora tratando de descubrir por qué mis puntos de vista dejaron de girar. shouldAutorotateToInterfaceOrientation se estaba convocando solo una vez en el inicio y cuando se presentaron las tablas de clasificación/logros de Game Center.

3

Tuve el mismo problema: el motivo fue que fue mi primer UIViewController, lo creé sobre la marcha en mi ApplicationDelegate, agregué su View a mi UIWindow y lo lancé de inmediato.

Eso, por supuesto, no es correcto, ya que acabo de agregar el UIView del UIViewController (retenerlo) y luego de liberar todo el controlador.

En su lugar, debe agregar su primer UIViewController como una variable de instancia en su ApplicationDelegate y liberarlo en el método dealloc de su ApplicationDelegate.

+0

gracias, esto solucionó mi problema. – ChenXin

5

Apple Q & A tiene la solución detallada para el problema.

¿Por qué mi UIViewController no girará con el dispositivo?

http://developer.apple.com/library/ios/#qa/qa1688/_index.html

Si agrega un viewcontroller.view a UIWindow, debe establecer este viewcontroller como RootViewController.

[self.window addSubview: mainViewcontroller.view]; 
self.window.rootViewController=mainViewcontroller; 
0

Tengo el mismo problema pero con dos controladores de vista agregados a la ventana de UI de la aplicación. La razón es propiedad UIView del controlador de vista está incrustado dentro UIWindow pero junto a un controlador de vista adicional

de Apple Técnica Q & Un

http://developer.apple.com/library/ios/#qa/qa1688/_index.html

1

En mi caso, el ViewController estaba dentro de un NavigationController que fue utilizado por una vista "padre" Controlado que recibió los cambios de orientación.

Lo que hice en este padre era:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 

    if(_navigationController){ 
     return [_navigationController.topViewController shouldAutorotateToInterfaceOrientation: toInterfaceOrientation]; 
    } 

    return toInterfaceOrientation == UIInterfaceOrientationPortrait; 
} 

De esta manera se puede implementar su propio cambio de orientación en función de la lógica del controlador actualmente visible.

Cuestiones relacionadas