me siento hay muchas respuestas específicas que funcionan de manera intermitente, pero ninguno proporciona penetración en cuanto a cuáles son las ramificaciones o efectos secundarios son, en lo que respecta al resto de la aplicación o de otro ver controladores, si el usuario comienza a inclinar el teléfono fuera de el controlador de vista que desea controlar la orientación para ...
después de jugar con él, puede darse cuenta (como yo) de que pueden producirse resultados adversos o no deseados (es decir. los cambios de orientación ocurren cuando usted no los quiere, o viceversa).
mi realización principal implicó que solo el 'controlador de vista raíz' invocará 'shouldAutorotate', y NO cualquier controlador de vista individual que usted intente sobrescribir.
con esta realización parecía bastante difícil 'bloquear' una orientación específica para un controlador de vista específico.
(significado han vc_A sea siempre el retrato y no se les permite cambiar de paisaje, mientras que haciendo vc_B sea siempre paisaje y no se les permite cambiar a vertical)
después de reconocer esto, el siguiente algoritmo es lo funcionó para mí, ya que solo puedo rotar en controladores de vista específicos.
configuración:
primero hay que permitir que las orientaciones que desee, ya sea en el info.plist o el archivo principal de configuración del proyecto (estas orientaciones serán los únicos que se pueden utilizar en su código)

código:
1) en mi controlador de vista raíz (aquí: MasterViewC ontroller) designé una propiedad BOOL (allowAutorotate) que se utilizará cuando se invoque 'shouldAutorotate'.
2) también hacen que el controlador de vista raíz sea un singleton por lo que es fácilmente accesible desde cualquier otro controlador de vista secundario (sin tener que pasar las referencias).
NOTA: También puede usar el patrón de observador/notificación o delegación o algún otro patrón, pero para mí el patrón Singleton era más fácil
3) añadir el delegado '- (BOOL) shouldAutorotate' y utilizar la BOOL allowAutorotate para su devolución
4) crea un método de instancia 'setInterfaceOrientation'. alguna otra clase llamará a este método en su 'viewDidLoad' y/o en su 'viewWillDisappear'
// 1)
@implementation MasterViewController {
BOOL allowAutorotate;
}
// 2)
+ (id)sharedMasterViewController {
static MasterViewController *sharedMasterViewController = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMasterViewController = [[self alloc] init];
});
return sharedMasterViewController;
}
- (id)init
{
self = [super init];
if (self)
{
allowAutorotate = NO;
}
return self;
}
// 3)
- (BOOL)shouldAutorotate
{
return allowAutorotate;
}
// 4)
- (void)setInterfaceOrientation:(NSInteger)orientation
{
allowAutorotate = YES;
NSNumber *value = [NSNumber numberWithInt:orientation];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
allowAutorotate = NO;
}
5) finalmente, en alguna otra clase obtener el controlador de vista raíz e invocar 'setInterfaceOrientation' consecuencia
// 5)
#import "MasterViewController.h"
@implementation SomeViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[[MasterViewController sharedMasterViewController] setInterfaceOrientation:UIInterfaceOrientationLandscapeRight];
}
- (void)viewWillDisappear:(BOOL)animated
{
[[MasterViewController sharedMasterViewController] setInterfaceOrientation:UIDeviceOrientationPortrait];
}
notas:
1) el resultado de este ejemplo debería ser que la aplicación se carga inicialmente en el retrato, a continuación, cuando se carga 'SomeViewController', que va a cambiar a horizontal, y luego, cuando Remov e, cambiará de nuevo a retrato.
2) funciona así ...
cada vez que físicamente inclinar el teléfono, se invoca el delegado 'shouldAutorotate' (sólo desde el 'punto de vista del controlador de la raíz'),
así cada vez que mediante programación inclinar el teléfono
NSNumber *value = [NSNumber numberWithInt:orientation];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
el delegado 'shouldAutorotate' es invocado.
Es por esto que primera 'allowAutorotate = SI;', a continuación, 'inclinar el teléfono', a continuación, 'allowAutorotate = NO;'
por lo tanto, tenemos el resultado de solo permitir/realizar el cambio de orientación una vez, programáticamente, exactamente cuando lo deseemos.
glhf!
Obsoleto en iOS 6.0. Sobreescriba los métodos soportadosInterfaceOrientations y preferredInterfaceOrientationForPresentation en su lugar.) – MOBYTELAB