He buscado una respuesta para esto, pero no podía encontrar nada que resolvió mi problema.

Así que aquí está el problema:
Tengo la costumbre de tener un UINavigationController, cuando se crea la supportedInterfaceOrientations método se llama en el rootViewController(sólo admite retrato).
Pero cuando se empuja un otro ViewController en la pila este método no es llamado en la empujó ViewController(compatible con todos pero al revés).

Lo resuelto por la llamada [self supportedInterfaceOrientations] en el viewDidLoad-método, pero creo que eso no es una buena forma de resolver el problema.

Espero que usted me puede ayudar en este asunto.

Aquí está mi código que he implementado en el segundo viewController.

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [[[UIApplication sharedApplication] delegate] setGlobalOrientationMask:UIInterfaceOrientationMaskAllButUpsideDown];
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else {
        [[[UIApplication sharedApplication] delegate] setGlobalOrientationMask:UIInterfaceOrientationMaskAll];
        return UIInterfaceOrientationMaskAll;
    }
}

Creo que la solución de johnMa debería funcionar bien para la mayoría de las aplicaciones, pero en mi caso, hay un problema especial creo, pero lo resuelto por mí ahora(no estoy seguro si es una buena, pero funciona).

He implementado la - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated método en mi navigationController-delegado.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (DEF_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7")) {
        if ([viewController respondsToSelector:@selector(supportedInterfaceOrientations)]) {
            [viewController supportedInterfaceOrientations];
        }
    }
}

Espero que esto pueda ayudar a otros con el mismo problema.

OriginalEl autor Manuel Wa | 2014-01-13

3 Comentarios

  1. 13

    Debe implementar estos código personalizado NavigationController.

     - (NSUInteger)supportedInterfaceOrientations {
        if ([self.topViewController isMemberOfClass:[RootViewController class]]){
            return UIInterfaceOrientationMaskPortrait;
        }else{
            return UIInterfaceOrientationMaskAllButUpsideDown;
       }  
     }

    porque cuando su dispositivo de girar, se le pedirá su aplicación rootController(Personalizado NavigationController) en primer lugar, si supportedInterfaceOrientations es no aplicar allí. a continuación, se le pedirá la rootController para supportedInterfaceOrientations.

    Una vista controlador que actúa como la raíz de controlador de vista de la ventana principal, o se presenta en pantalla completa en la ventana principal puede declarar qué orientaciones se apoya.Controlador De Vista De Guía De Programación

    esto ayudó, pero hay 1 problema que ocurre ahora, cuando rotación de vertical a horizontal, la primera rotación de llamadas supportedInterfaceOrientations en mi navigationcontroller, pero la rotación no está hecho, solo al girar una segunda vez para una orientación horizontal de la rotación se realiza correctamente
    encontraste alguna solución a la primera vez/segundo problema de tiempo? Estoy teniendo el mismo problema

    OriginalEl autor johnMa

  2. 2

    esto funciona muy bien en iOS 8.

    pero en iOS 9 (Xcode 7) me hizo una advertencia:
    «Conflicto de tipo de retorno en aplicación de la ‘supportedInterfaceOrientations’: ‘UIInterfaceOrientationMask’ (aka ‘enum UIInterfaceOrientationMask’) vs ‘NSUInteger’ (aka ‘unsigned long’)»

    lo he cambiado a:

    -(UIInterfaceOrientationMask)supportedInterfaceOrientations{  
         return UIInterfaceOrientationMaskPortrait;  
    }

    OriginalEl autor Ar No

  3. 0

    Swift versión de la respuesta:

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        if self.topViewController is ViewController {
            return .Portrait
        } else {
            return .All
        }
    }

    OriginalEl autor Hayden Holligan

Dejar respuesta

Please enter your comment!
Please enter your name here