2009-01-10 31 views
9

De acuerdo, tengo mi aplicación normal que está en modo vertical. Puedo forzar mi aplicación para ir al modo horizontal para una vista (usando navigationcontroller y viewcontroller) así:SDK de iPhone: Orientación (Vistas de paisaje y retrato)

- (void)viewWillAppear:(BOOL)animated { 
    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight]; 
} 

Pero luego cuando vuelva al menú principal (tableview) que va directamente de nuevo a vertical. Trato este código:

- (void)viewWillAppear:(BOOL)animated { 
    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait]; 
} 

Pero eso no funciona ..

¿Alguna idea?

Respuesta

9

Eche un vistazo a la función shouldAutorotateToInterfaceOrientation: en la clase UIViewController. Esta función devuelve SÍ si las orientaciones son compatibles con su UIView. Si devuelve SÍ solo a la orientación horizontal, entonces el iPhone se colocará automáticamente en esa orientación.

El siguiente código debería hacerlo. Colóquelo en el UIViewController que controla la vista que desea colocar en modo horizontal.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationLandscape); 
} 
0

Debe editar su archivo Info.plist para agregar la clave UIInterfaceOrientation con el valor apropiado (UIInterfaceOrientationLandscapeRight o UIInterfaceOrientationLandscapeLeft).

+0

es que justo para volver a la pantalla principal de la tabla retrato? porque quiero todo retrato, solo un paisaje de vista. Puedo obtener el paisaje, pero luego, cuando regrese, tengo que rotar el teléfono para que vuelva a mi retrato. No quiero que los usuarios tengan el paisaje de descanso. – Domness

7

Para conseguir que esto funcione, he añadido esto a la RootViewController:

- (void)viewWillAppear:(BOOL)animated { 
    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait]; 

} 

Esto parece estar trabajando ahora.

+0

¿Esto cuenta como usar API privada?la orientación está documentada como una propiedad de solo lectura. – lawrence

+0

Todo está bien a través de Apple :) – Domness

+0

esta línea solo puede rotar el simulador. en lógica, no puede usar scripts de programación para hacer que los usuarios roten sus iPhones; solo puedes dar pistas a los usuarios. – Raptor

3

Aquí es lo que estoy haciendo para ello:

en primer lugar, poner esto a definir en la parte superior de su archivo, justo debajo de las #imports:

#define degreesToRadian(x) (M_PI * (x)/180.0) 

a continuación, en el viewWillAppear: Método

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];  
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) { 
    self.view.transform = CGAffineTransformIdentity; 
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320); 
} 

si quieres que para ser animado, a continuación, se puede envolver todo el asunto en un bloque de animación, así:

[UIView beginAnimations:@"View Flip" context:nil]; 
[UIView setAnimationDuration:1.25]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];  
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) { 
    self.view.transform = CGAffineTransformIdentity; 
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320); 
} 
[UIView commitAnimations]; 

Luego, en su controlador de modo vertical, puede hacer lo contrario - verifique si está actualmente en horizontal, y en ese caso, gírelo de nuevo a Vertical.

+0

estás cerca. self.view.frame = CGRectMake (0.0f, 0.0f, 480.0f, 320.0f); self.view.transform = CGAffineTransformMakeRotation (degreesToRadian (-90)); self.view.center = CGPointMake (160.0f, 240.0f); tenemos que establecer el centro de visión en el centro de la pantalla y llenar la pantalla (sin el espacio de 20px). – Raptor

+0

Si no desea ocultar la barra de estado, puede agregar [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeRight]; –

0

No puede usar esta API privada.

Hay una solución para hacer eso: es usar un controlador de vista y agregar su vista a la ventana. luego en ese controlador forzarás el paisaje en el shouldAutorotate ... method. Funciona bien, pero asegúrese de que sea necesario para que su proyecto lo use, porque no es muy inteligente obligar al usuario a encender su iPhone. Por cierto, aquí hay un código de ejemplo si lo necesitas.

http://www.geckogeek.fr/iphone-forcer-le-mode-landscape-ou-portrait-en-cours-dexecution.html

Cuestiones relacionadas