2011-05-24 7 views
7

¿Alguien sabe si existe la posibilidad de bloquear la autorrotación de iPhone programáticamente para una sola vista? Quiero hacer algún tipo de ayuda con la vista semi-transculent, pero quiero apoyar solo la orientación horizontal incluso las otras vistas pueden rotar. Así que deseo bloquear la rotación cuando esta vista esté en la parte superior.Bloqueo de autorrotación, programáticamente

TNX

EDIT: Más detalles: uno UIController tiene 7 UIView ... y me gustaría para bloquear el auto rotación justo cuando el último que se produce en la parte superior.

Respuesta

4

Usar la siguiente ...

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 
+4

Obsoleto en iOS 6.0. Sobreescriba los métodos soportadosInterfaceOrientations y preferredInterfaceOrientationForPresentation en su lugar.) – MOBYTELAB

0
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {      
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 
3

Se puede conectar a la ventana. Después de cargar la vista, haga

[self.view.window addSubview:yourStaticView]; 
[self.view.window bringSubviewToFront:yourStaticView]; // Do only if necessary 

Quítela cuando salga de esta vista. Probablemente en viewWillDisappear: o viewDidDisappear:.

0

He encontrado una solución muy simple y funcional. Al agregar la vista superior, establezco un BOOL que luego controla la rotación.

 

// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations; we support all. 

    if (helpViewOnTheTop) { 
     return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
    } 
    else 
    { 
     return YES; 
    } 
} 


2
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    //If you don't want to support multiple orientations uncomment the line below 
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait); 
    //return [super shouldAutorotateToInterfaceOrientation:toInterfaceOrientation]; 
} 
14

Esta pregunta fue hecha hace más de un año, pero el método aceptado es ahora deprecated in iOS 6 así que si alguien está interesado en hacer esto en iOS 6 entonces es necesario utilizar supportedInterfaceOrientations en el controlador superior.

Imagine que tiene una configuración como esta ...

  • barra de pestañas controlador
    • Navigation Controller
      • Vista Controlador

... entonces necesita configurar el método supportedInterfaceOrientations en el controlador de la barra de pestañas.

Crear una subclase del controlador de la barra de pestañas (o controlador de navegación si eso es en la parte superior) y establecer estos métodos está dentro ...

- (BOOL)shouldAutorotate { 
    //Use this if your root controller is a navigation controller 
    return self.visibleViewController.shouldAutorotate; 
    //Use this if your root controller is a tab bar controller 
    return self.selectedViewController.shouldAutorotate; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    //Navigation Controller 
    return self.visibleViewController.supportedInterfaceOrientations; 
    //Tab Bar Controller 
    return self.selectedViewController.supportedInterfaceOrientations; 
} 

... entonces en sus controladores de vista individuales que pueda establecer las propiedades que desee ...

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    //return supported orientation masks 
    return UIInterfaceOrientationMaskLandscape; 
} 
+0

la mejor respuesta aquí :) He salpicado todos los controladores de vista con los métodos propuestos sin ningún efecto hasta que haya agregado al controlador de nivel superior los mismos métodos pero con referencia a (seleccionado o visible) ver el controlador. –

1

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)

enter image description here

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!

Cuestiones relacionadas