¿Cómo configuro de manera programática la orientación del dispositivo en iOS 7?

Estoy trabajando en una aplicación para iPad, usando AutoLayout, donde si el usuario habilita un cierto modo (modo "heads-up"), quiero admitir solo la orientación vertical (o vertical del retrato) y, además, si el dispositivo está Paisaje, me gustaría cambiar automáticamente al modo retrato.

En el controlador de vista superior, tengo lo siguiente:

- (NSUInteger) supportedInterfaceOrientations {
    if (self.modeHeadsUp) {
        return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
    } else {
        return UIInterfaceOrientationMaskAll;
    }
}

- (BOOL) shouldAutorotate {
    return TRUE;
}

Basado en las respuestas que he visto en otros lugares aquí, la respuestaparece para ser que debería usar "aplicación setStatusBarOrientation". Por lo tanto, en el método en el que el usuario ha seleccionado el modo "mano a mano", he incluido:

    UIApplication *application = [UIApplication sharedApplication];
    [application setStatusBarOrientation:UIInterfaceOrientationPortrait
                                animated:YES];

Sin embargo, esto simplemente no parece hacer nada. Si bien puedo mover físicamente el dispositivo para que gire en vertical, no lo hace automáticamente.

De hecho, cuando estoy en modo horizontal después de ejecutar el código anterior para intentar establecer la orientación mediante programación, cuando pregunto a la aplicación "statusBarOrientation" con el siguiente código, permanece en "4" para el paisaje:

UIApplication *application = [UIApplication sharedApplication];
int orientation = [application statusBarOrientation];
self.movesTextView.text = [NSString stringWithFormat:@"ORIENTATION %d", orientation];

Parecía que tal vez el autolayout no se estaba activando con setStatusBarOrientation, así que intenté agregar este código después, sin ningún efecto:

    [super updateViewConstraints];
    [self.view updateConstraints];

Me doy cuenta de que Apple quiere dejar la orientación del dispositivo en manos del usuario. Sin embargo, me gustaría poder admitir el modo horizontal cuando no esté en modo "heads-up".

¿Me falta algo para poder forzar el cambio de orientación?

Respuestas a la pregunta(16)

Su respuesta a la pregunta