En iOS 6 shouldAutorotateToInterfaceOrientation no está trabajando pero que funcione bien en iOS 5.0 o 5.1.

¿Qué debo necesidad de cambio en iOS 6.
Aquí está mi código

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
if([[[SampleApplicationAppDelegate instance].callInfoDictionary valueForKey:IS_CHAT] isEqualToString:NO_RESPONSE])
{
    int nAngle = 0;
    BOOL bRet = NO;

    switch (interfaceOrientation) {
        case UIInterfaceOrientationPortrait:
            nAngle = 90;
            bRet = YES;
            NSLog(@".......Preview = %f %f",_previewCamera.frame.size.width,_previewCamera.frame.size.height);

            _previewCamera.transform = CGAffineTransformMakeRotation(M_PI*1.5);

            NSLog(@"Preview = %f %f",_previewCamera.frame.size.width,_previewCamera.frame.size.height);
            break;

        case UIInterfaceOrientationPortraitUpsideDown:
            nAngle = 270;
            bRet = YES;
            _previewCamera.transform = CGAffineTransformMakeRotation(M_PI_2);
            break;

        case UIInterfaceOrientationLandscapeLeft:
            nAngle = 0;
            bRet = YES;
            //_previewCamera.transform = CGAffineTransformMakeRotation(M_PI*1.5);
            break;

        case UIInterfaceOrientationLandscapeRight:
            nAngle = 180;
            bRet = YES;
            //_previewCamera.transform = CGAffineTransformMakeRotation(M_PI_2);
            break;

        default:
            break;
    }                
    return bRet;
}    
if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    return YES;     
return NO;    

}

cuando la búsqueda de esta orientación problema que he encontrado todo esto

Uno
Dos

pero nada funciona para mí 🙁
Ayuda por favor …..

InformationsquelleAutor Saif | 2012-09-25

6 Comentarios

  1. 51

    EDICIÓN: Esto sucede, es porque Apple ha cambiado la forma de gestión de la Orientación de UIViewController. En iOS6 orientación se maneja de forma diferente. En iOS6 shouldAutorotateToInterfaceOrientation método está en desuso. Vista de controladores (como UINavigationController) no consultar a sus hijos para determinar si deben rotación automática. Por defecto, una aplicación y un controlador de vista de la interfaz compatible con orientaciones se establece en UIInterfaceOrientationMaskAll para el iPad idiom y UIInterfaceOrientationMaskAllButUpsideDown para el iPhone idioma.

    Si quieres una vista específica para cambiarse a la orientación deseada que usted tiene que hacer algún tipo de subclase o categoría y anular el auto rotación métodos para devolver la orientación deseada.

    Lugar este código en la raíz de controlador de vista. Esto ayudará a que el UIViewController para determinar su orientación.

      //RotationIn_IOS6 is a Category for overriding the default orientation.
    
      @implementation UINavigationController (RotationIn_IOS6)
    
     -(BOOL)shouldAutorotate
        {
          return [[self.viewControllers lastObject] shouldAutorotate];
        }
    
      -(NSUInteger)supportedInterfaceOrientations
       {
         return [[self.viewControllers lastObject] supportedInterfaceOrientations];
       }
    
     - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
     {
         return [[self.viewControllers lastObject]  preferredInterfaceOrientationForPresentation];
     }
    
     @end

    Ahora lo que necesita para implementar debajo de métodos (introducido en iOS6) en viewController para la orientación

    - (BOOL)shouldAutorotate
    {
        //returns true if want to allow orientation change
        return TRUE;
    
    
    }
    - (NSUInteger)supportedInterfaceOrientations
    {   
         //decide number of origination tob supported by Viewcontroller.
         return UIInterfaceOrientationMaskAll;
    
    
    }
    
     - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
       {
         //from here you Should try to Preferred orientation for ViewController 
       }

    Y poner el código dentro del siguiente método. Cada vez que se cambia la orientación del dispositivo
    este método será llamado:

     - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)  interfaceOrientation duration:(NSTimeInterval)duration
    {
    if([[[SampleApplicationAppDelegate instance].callInfoDictionary valueForKey:IS_CHAT] isEqualToString:NO_RESPONSE])
    {
        int nAngle = 0;
        BOOL bRet = NO;
    
        switch (interfaceOrientation) {
            case UIInterfaceOrientationPortrait:
                nAngle = 90;
                bRet = YES;
                NSLog(@".......Preview = %f %f",_previewCamera.frame.size.width,_previewCamera.frame.size.height);
    
                _previewCamera.transform = CGAffineTransformMakeRotation(M_PI*1.5);
    
                NSLog(@"Preview = %f %f",_previewCamera.frame.size.width,_previewCamera.frame.size.height);
                break;
    
            case UIInterfaceOrientationPortraitUpsideDown:
                nAngle = 270;
                bRet = YES;
                _previewCamera.transform = CGAffineTransformMakeRotation(M_PI_2);
                break;
    
            case UIInterfaceOrientationLandscapeLeft:
                nAngle = 0;
                bRet = YES;
                //_previewCamera.transform = CGAffineTransformMakeRotation(M_PI*1.5);
                break;
    
            case UIInterfaceOrientationLandscapeRight:
                nAngle = 180;
                bRet = YES;
                //_previewCamera.transform = CGAffineTransformMakeRotation(M_PI_2);
                break;
    
            default:
                break;
        }                
      }    

    Edición: comprobar su ventana, usted necesita agregar el controlador en la ventana como rootViewController en lugar de addSubview como el de abajo,

    self.window.rootViewController=viewController;

    Para obtener más información aquí‘s un artículo acerca de iOS6.0 Beta 2 OTA.

    Espero que esto fue útil.

    • Gracias compañero! Gran categoría! Simple pero útil 🙂
    • u de bienvenida!!!!!!
    • por favor, tenga en cuenta que este es un hackish solución – sustitución de métodos mediante el uso de la categoría se desaconseja stackoverflow.com/questions/5272451/…
    • La suya es la solo respuesta he visto que menciona el crucial delegado método: «willAnimateRotationToInterfaceOrientation». Esto permite que cada uno de viewControllers para hacer cosas específicas con el cambio en la orientación como «shouldAutorotateToInterfaceOrientation» usa hacer. Lo que fue servido por cambiar esto, Apple?
    • auto.de la ventana.rootViewController=viewController; hizo el truco
    • [self.viewControllers lastObject] es el mismo que self.topViewController
    • Por dios, nada como la depreciación de los elementos de una sola línea 2 método para reemplazarlo con varios métodos, que suman alrededor de 100 líneas de…

  2. 15

    La forma en que me fijo, este problema fue la sustitución de la línea siguiente cuando mi aplicación se inicia en el Delegado de la Clase

     window addSubview: navigationController.view

    con

    window.rootViewController = navigationController

    Después de haber hecho este cambio mi app comenzó a manejar la pantalla rotaciones

    • Por defecto, una aplicación y un controlador de vista de la interfaz compatible con orientaciones se establece en UIInterfaceOrientationMaskAll para el iPad lenguaje y UIInterfaceOrientationMaskAllButupsidedown para el iPhone idioma. así que eso es obra sólo de orientación específica , si desea permitir que todos los de orientación para el iphone tendrás permitir como yo he hecho en mi respuesta.
    • esto funcionó para mí también, gracias por la sugerencia!
    • También he usado este mediante el establecimiento de rootViewController en lugar de agregar subvista en que gracias tio.
  3. 3

    Esto es debido a que Apple ha dejado de utilizar shouldautorate método de ios6 uso de estos métodos en lugar

    - (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0);
    - (NSUInteger)supportedInterfaceOrientations NS_AVAILABLE_IOS(6_0);
    //Returns interface orientation masks.
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation NS_AVAILABLE_IOS(6_0);
  4. 1

    He Resuelto este problema sólo tiene que utilizar esta

        - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {    
    if(![AppDelegate instance])
    return (interfaceOrientation == UIInterfaceOrientationPortrait) || (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
    if([[[AppDelegate instance].callInfoDictionary valueForKey:IS_CHAT] isEqualToString:NO_RESPONSE])
    {
    int nAngle = 0;
    BOOL bRet = NO;
    switch (interfaceOrientation) {
    case UIInterfaceOrientationPortrait:
    {
    nAngle = 90;
    bRet = YES;
    NSLog(@".......Preview = %f %f",_previewCamera.frame.size.width,_previewCamera.frame.size.height);
    NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"6.0" options: NSNumericSearch];
    if (order == NSOrderedSame || order == NSOrderedDescending)
    {
    //OS version >= 6.0
    NSLog(@"ami iOS 6 er device");
    _previewCamera.transform = CGAffineTransformMakeRotation(M_PI_2);
    }
    else
    {
    //OS version < 6.0
    _previewCamera.transform = CGAffineTransformMakeRotation(M_PI*1.5);
    }
    NSLog(@"Preview = %f %f",_previewCamera.frame.size.width,_previewCamera.frame.size.height);
    NSLog(@"-->%s %d",__FUNCTION__,__LINE__);
    break;
    }
    case UIInterfaceOrientationPortraitUpsideDown:
    {
    nAngle = 270;
    bRet = YES;
    NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"6.0" options: NSNumericSearch];
    if (order == NSOrderedSame || order == NSOrderedDescending)
    {
    //OS version >= 6.0
    NSLog(@"ami iOS 6 er device");
    _previewCamera.transform = CGAffineTransformMakeRotation(M_PI*1.5);
    }
    else
    {
    //OS version < 6.0
    _previewCamera.transform = CGAffineTransformMakeRotation(M_PI_2);
    }
    break;
    }
    case UIInterfaceOrientationLandscapeLeft:
    nAngle = 0;
    bRet = YES;
    //_previewCamera.transform = CGAffineTransformMakeRotation(M_PI*1.5);
    break;
    case UIInterfaceOrientationLandscapeRight:
    nAngle = 180;
    bRet = YES;
    //_previewCamera.transform = CGAffineTransformMakeRotation(M_PI_2);
    break;
    default:
    break;
    }        
    return bRet;
    }   
    if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    return YES; 
    return NO;    
    }
    • para tu tipo de información me gustaría decirle a este método - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation ha dejado de utilizar en iOS6. esto significa que,en el futuro que ese método se puede quitar de forma SDK de iOS. Así que ten cuidado.
    • Sí. Estás en lo correcto.Este método obsoleto en iOS6 en un futuro cercano & estoy en busca de una mejor solución.
    • tener una mirada de mi respuesta amigo.por favor, hágamelo saber si usted tiene cualquier problema en mi respuesta
  5. 0

    por favor probar este va a ser útil para usted.

    escribir código en tu clase viewcontroller

    -(BOOL)shouldAutorotate
    {
    return YES;
    }
    -(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
    }

    A continuación, en el appdelegate búsqueda esta línea [ventana addSubview:viewController.ver]
    y reemplazarlo con ventana.rootViewController = viewController;

    saludos va a trabajar.su solución sencilla para ios 6

  6. 0

    esto funcionó para mí

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
    //Return YES for supported orientations
    return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    }
    - (BOOL)shouldAutorotate {
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (orientation == UIInterfaceOrientationPortrait) {
    //your code for portrait mode
    }
    return YES;
    }
    - (NSUInteger)supportedInterfaceOrientations
    {
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown;
    }

Dejar respuesta

Please enter your comment!
Please enter your name here