2011-05-19 6 views
21

Bien, esta es la situación:¿Cómo fuerzo una UIInterfaceOrientation específica en una vista individual en un UINavigationController?

Tengo una aplicación en la que solo quiero UNA vista específica en un UINavigationController para tener una orientación horizontal. Esta vista es una UIImageView en la que estoy capturando una firma (ESA pieza funciona increíble). Así, de esta manera:

previous view --> signature view --> next view 
(portrait)  (landscape)  (portrait) 

Me parece que no puede encontrar una buena manera de forzar la orientación del dispositivo a una horizontal en esa pantalla de la firma. Nunca tendrá sentido tener una orientación vertical en la vista de firma porque realmente no hay espacio suficiente para iniciar sesión en ese ancho de pantalla.

¿Alguna idea brillante sobre cómo lograr esto? He considerado posiblemente hacer la vista de firma modalmente, rompiendo así el controlador de navegación. ¿Pensamientos?

+0

¿Hizo eso el truco? – Nirma

+0

El proyecto finalizó por razones presupuestarias antes de que tuviera la oportunidad de resolverlo. Si alguna respuesta suena como si estuviera en la línea de lo que estaba buscando, son las respuestas de Epic_orange y mdizzle de usar la estrategia de transformación de vista. La solución de Nirma es la tarifa estándar con la que todos parecen responder. Sin embargo, esto no funciona con resultados deseables en el contexto de un UINavigationController. Pruébalo: configura un UINav con tres vistas ... crea el segundo SIEMPRE horizontal. No puedo aceptar una respuesta porque no he verificado, y probablemente no lo haga. Demasiado ocupado con ASP.NET MVC en estos días. – NovaJoe

Respuesta

1

Creo que puede insertar esta vista dentro de un controlador de vista y sobrescribir el método ShouldRotateToInterfaceOrientation. ¡Buena suerte!

0

utilizar una vista en sólo el paisaje, Tengo el siguiente en el ViewController:

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

Pero esto NO FORCE la vista a una orientación. Es un problema tonto. Cuando estás en el contexto de un UINavigationController, suceden cosas extrañas en relación con el diseño de la vista y la orientación de la barra de estado. Nunca llegué al fondo de esto, pero tampoco me importó porque el proyecto se canceló por otros motivos. – NovaJoe

4

Por desgracia, todos los UIViewControllers raíz en el interior de un controlador de navegación debe apoyar cualquiera de sus orientaciones niño. Esto significa que el primer controlador de vista en su instalación debe admitir el paisaje, de lo contrario, el niño solo admitirá retrato.

La mejor manera de implementar lo que está buscando es crear un UIViewController que muestre su vista de contenido en una transformación rotativa, y simplemente colocar por defecto todos los UIViewControllers en esa pila en vertical.

+0

¿Cómo implementa * muestra su vista de contenido en una transformación rotada *? ¿Tienes un ejemplo para esto? – testing

6

Simplemente anule este método UIViewController para que solo devuelva true para un paisaje como ese y el iphone se verá forzado a rotar a la orientación del dispositivo, ya que no tiene otra opción.

- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 
+3

Esto solo funciona si el UIViewController no es parte de un controlador de navegación. Tienes que poner este código en el UINavigationController y verificar si el control ViewView superior es el que tienes en el paisaje. – Peter

9

Usted puede tratar de forzar Dispositivo para girar a la orientación necesaria - pero hay que manejarlo manualmente (además de anular UIViewController métodos de manipulación de orientación).

Para girar el dispositivo puede utilizar los siguientes métodos:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 

Pero en ella pueden no funcionar en todas las situaciones ...

También enfoque indocumentado disponibles:

[[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") 
             withObject:(__bridge id)((void*)UIInterfaceOrientationLandscapeLeft)]; 
+1

¿Obtuviste esto para trabajar en un UINavigationViewController? Cuando lo hago, rota la barra de estado pero no el controlador. – Peter

0

tengo una aplicación que solo tiene vistas de paisaje que incluso comienza en el paisaje. Esto funcionaba bien en iOS 5.x pero dejó de funcionar en iOS 6.x

Después de probar muchas cosas, algunas más cuestionables que otras, encontré una solución que para mí es clara y predecible.

Hice varias cosas.

- Mantuve las vistas en modo horizontal en IB.

- Revisé ambos modos horizontal en la configuración del proyecto - hay un cuatro iconos allí para su control

- Orientación MGMT ha cambiado en iOS 6.x Tenía que sobrescribir algunos métodos para apoyar el cambio de paisaje

este método es para iOS 5.x

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations. 
    return (interfaceOrientation & UIInterfaceOrientationMaskLandscape); 
} 

estos métodos son 2 para iOS 6.x

- (NSUInteger)supportedInterfaceOrientations 
{ 
    NSUInteger supportedOrientations = UIInterfaceOrientationMaskLandscape; 
    return supportedOrientations; 
} 


- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- Pero la clave era cambiar la lógica en AppDelegate. El código original que tenía allí era agregar una subvista (controller.view) a la ventana. Esto dejó de funcionar en iOS 6.x - Cambié la llamada a window.setRootController. Ese fue el paso final que selló - que no funcionaría sin hacer este cambio final

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{   
    //[self.window addSubview:viewController.view]; 
    [self.window setRootViewController:viewController]; 
    [self.window makeKeyAndVisible]; 


    return YES; 
} 
0

El UINavigationController anula la contienen valores de orientación UIViewController, así que hay que crear una subclase personalizada de UINavigationController con lo siguiente para 5.1:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if ([[self topViewController] isKindOfClass:[SigCaptureViewController class]]) { 
     return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
    } else { 
     return UIInterfaceOrientationIsPortrait(interfaceOrientation); 
    } 
} 

para 6,0 y por encima de lo necesario:

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    if ([[self topViewController] isKindOfClass:[EXTRASigCaptureViewController class]]) { 
     return UIInterfaceOrientationMaskLandscape; 
    } else { 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 

lo que no he descubierto es cómo hacer que la fuerza de la Uina vigationController para rotar. llamando al [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO] hace que la barra de estado gire pero no hace que la vista gire.

Cuestiones relacionadas