2012-09-15 59 views
12

¿Alguien puede confirmar que para soportar iOS 6 e iOS 5 no tiene sentido agregar los nuevos métodos de autorrotación de iOS 6, ya que Apple sugiere que estos métodos se ignoran por completo si usted está también implementando los métodos de iOS 5?Admite la autorrotación iOS 6 e iOS 5

En particular, hablando de los métodos y - (NSUInteger)supportedInterfaceOrientations- (BOOL) shouldAutorotate - que éstos son ignorados y sintetizados por el compilador si también implementa el - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Respuesta

8

Debe agregar una nueva devolución de llamada para autorrotación si está empaquetando su aplicación en la nueva SDK. Sin embargo, estas devoluciones de llamadas se recibirán solo cuando dicha aplicación se ejecute en dispositivos con iOS 6. Para los dispositivos que se ejecutan en versiones anteriores de iOS, se recibirán devoluciones de llamada anteriores. Si no implementa las nuevas devoluciones de llamada, el comportamiento predeterminado es que su aplicación se ejecute con todas las orientaciones en iPad y todas excepto la orientación de UpsideDown en iPhone.

0

Hay que establecer un indicador en alguna parte (creo que en su información. plist) que indica cuál de los dos usa. Si usa el nuevo, no puede compilar para iOS 5 (o al menos, no funcionará en iOS 5). Si usa el anterior, los nuevos métodos no se están llamando. Entonces sí, tienes que elegir qué método (s) quieres usar, y si quieres soportar iOS 5, no puedes usar los nuevos métodos.

+0

¿Estás seguro de que, con respecto a la bandera? No vi ninguna mención de eso en las notas de la versión de iOS 6; simplemente afirman que los nuevos métodos se ignoran si se implementan los métodos anteriores. – johnbakers

+0

Eche un vistazo a la Sesión 200 de WWDC, alrededor de 26 'hablan de esto. Consulte también la sesión 236, 23'45 "en adelante. No estoy seguro si esto todavía está bajo NDA, así que mire directamente allí – Olaf

+3

Ambas devoluciones de llamadas son compatibles con el nuevo iOS 6. Se reciben nuevas devoluciones de llamadas en las aplicaciones empaquetadas con nuevo SDK y ejecutándose Dispositivos con iOS 6. Para todos los demás casos, las devoluciones de llamada anteriores son bien recibidas. Ha probado esto en numerosos casos. –

1
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationMaskAll; 
} 

-(void)viewWillLayoutSubviews 
{ 
if([self interfaceOrientation] == UIInterfaceOrientationPortrait||[self interfaceOrientation] ==UIInterfaceOrientationPortraitUpsideDown) 
    { 
     if (screenBounds.size.height == 568) 
     { 
      //set the frames for 4"(IOS6) screen here 
     } 
     else 

     { 
     ////set the frames for 3.5"(IOS5/IOS6) screen here 
     } 

} 
     else if ([self interfaceOrientation] == UIInterfaceOrientationLandscapeLeft||[self interfaceOrientation] == UIInterfaceOrientationLandscapeRight) 
     { 
     if (screenBounds.size.height == 568) 
     { 
      //set the frames for 4"(IOS6) screen here 
     } 
     else 

     { 
     ////set the frames for 3.5"(IOS5/IOS6) screen here 
     } 


    } 
//it is for IOS5 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
    return YES; 
    } 

- (void) viewWillLayoutSubviews este método va a llamar para IOS5/iOS6. este código es útil tanto para ios6/ios5/ios6 con pantalla de 3.5 "pantalla/4" con ios6.

+0

Trate de mantenerse alejado de soluciones de "número mágico". – dooleyo

+0

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationMaskAll; } Causará un bloqueo. Debido a que el valor de retorno debe ser una orientación concreta, pero no la máscara –

1

Creo que la solución más elegante es:

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
    return ((1 << toInterfaceOrientation) & self.supportedInterfaceOrientations) != 0; 
} 

Do Me he perdido algo?

+2

o simplemente 'return ((1 << aOrientaciónInterfaz) & self.supportedInterfaceOrientations)! = 0;' – user102008

+0

@danskeel ¿Cómo ayuda su respuesta con la pregunta original ?: Apoya * * iOS 5 y 6? Invocar 'supportedInterfaceOrientations' provoca un bloqueo cuando se ejecuta en iOS 5 porque es una característica de iOS 6. '*** Aplicación de finalización debido a una excepción no detectada 'NSInvalidArgumentException', razón: '- [MYMainMenuTableViewController supportedInterfaceOrientations]: selector no reconocido enviado a la instancia 0x68649f0'' –

+0

¿Agregó los dos métodos que mencioné? Supongo que olvidó agregar el primero a su clase 'MYMainMenuTableViewController'. No puede ser un problema porque es solo un método y puedo llamarlo solo. – DanSkeel

8

Para iOS5 Rotación. Comprobar para su orientación deseada y volver SÍ

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if ((interfaceOrientation==UIInterfaceOrientationPortrait)||(interfaceOrientation==UIInterfaceOrientationPortraitUpsideDown)) { 
     return YES; 
    } 
    else return NO; 
} 

ayuda del IOS 6.0 autorrotación

- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationIsPortrait(UIInterfaceOrientationMaskPortrait|| UIInterfaceOrientationMaskPortraitUpsideDown); 

} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationIsPortrait(UIInterfaceOrientationPortrait|| UIInterfaceOrientationPortraitUpsideDown); 

} 
+0

it sí funcionó para mí, – Aziz

+0

En el código iOS 6, ¿no debería 'supportedInterfaceOrientations' simplemente devolver' UIInterfaceOrientationMaskPortrait'? ¿Y no debería 'preferredInterfaceOrientationForPresentation' simplemente devolver' UIInterfaceOrientationPortrait'? El código anterior de iOS 6 no me parece correcto. – Rob

+0

@Rob: solo estoy sugiriendo métodos, por favor devuelva su propia orientación como lo desee. Si no desea UIInterfaceOrientationPortraitUpsideDown puede devolver solo UIInterfaceOrientationPortrait. – NaXir

0

para apoyar autorrotaciones tanto IOS5 y iOS6 que necesitamos para proporcionar devoluciones de llamadas en caso de iOS6 ....

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(orientationChanged:) 
    name:UIDeviceOrientationDidChangeNotification object:nil]; 

y tenemos que llamar

- (NSUInteger)supportedInterfaceOrientations { 
return UIInterfaceOrientationMaskPortrait; 

} 

-(BOOL)shouldAutoRotate{ 
    return YES; 
    } 

para IOS5

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
return ((toInterfaceOrientation == UIInterfaceOrientationPortrait) || (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)); 
} 
+0

No creo que sea necesario codificar las devoluciones de llamada, son automáticas en iOS si usa UIKit y tiene configuradas correctamente las configuraciones del proyecto. – johnbakers