2010-11-02 28 views
13

Tengo mi aplicación para iPad creada con la plantilla SplitView. Me pregunto cuál es la mejor manera de restringir mi aplicación al modo horizontal?¿Cómo restringir mi aplicación al modo horizontal?

He tratado anulando shouldAutorotateToInterfaceOrientation: método en DetailViewController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
} 

pero 4.2 GM todavía está libre de errores y falla para mostrar la vista controlador. ¿Qué otras opciones tengo?

Gracias de antemano.

Update1

  • ya he presentado un informe de error: Bug ID #8620135

  • Mi aplicación está casi terminado y tengo que encontrar un trabajo arround ya que no creo que se van a resolver esto antes de que salga oficialmente 4.2 (¡GM ya está fuera!)

    Para recrear el error, simplemente use la plantilla SplitView y anule arriba método en cualquiera de las UIViewControllers (RootViewController o DetailViewControllers)

Update2

he encontrado un trabajo en torno. (Ver Update3 para la completa solución temporal)

Set UISupportedInterfaceOrientations única para apoyar paisaje, esto obligará a la aplicación para iniciar en modo horizontal permitiendo DetailViewController para iniciar correctamente (por lo tanto se muestra correctamente)

<key>UISupportedInterfaceOrientations</key> 
<array> 
    <string>UIInterfaceOrientationLandscapeLeft</string> 
    <string>UIInterfaceOrientationLandscapeRight</string> 
</array> 

Pero si se gira el dispositivo, resulta el modo de retrato !!!, por lo sigue siendo necesaria para anularshouldAutorotateToIntercafeOrientation: que el anterior

Discusión:

Si esto no fuera un error, esperaría un error de advertencia o ejecución, excepción o algo al iniciar la aplicación en una orientación que no es compatible con el controlador de vista. Además, ¿por qué solo DetailViewController no se muestra? Si esto fuera una especificación, entonces RootViewController tampoco debería cargarse. ¿No crees? gracias por su ayuda ...;)

Update3

Después de más pruebas me he dado cuenta que por encima de solución alternativa no funciona en algunos casos. Por ejemplo, cuando se inicia la aplicación cuando el dispositivo está en el paisaje, ¡no funcionará !. El problema real parece ser que en iOS4.2GM UISplitViewController necesita que todos sus controladores tengan todas las rotaciones para estar disponibles en su tiempo de carga. Entonces, es necesario engañarlo para que se cargue en modo Paisaje y luego no le permita rotar sus controles de vista.

Así que aquí está la nueva solución para este iBug molesto.

Paso 1: Conjunto Info.plist así:

<key>UISupportedInterfaceOrientations</key> 
<array> 
    <string>UIInterfaceOrientationLandscapeLeft</string> 
    <string>UIInterfaceOrientationLandscapeRight</string> 
</array> 

Paso 2 Establecer una nueva bandera en DetailViewController.m o .h (a partir de plantilla SplitView)

BOOL lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135. 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    //WORK-ARROUND: Bug ID# 8620135. 
    if (lockRotation) { 
     return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
    }else{ 
     return YES; 
    } 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    //set NO here since this is called before shouldAutorotateToInterfaceOrientation method is called 
    lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135. 
} 
- (void)viewDidAppear:(BOOL)animated { 
    //set YES as soon as possible, but after shouldAutorotateToInterfaceOrientation method was called 
    lockRotation = YES; //WORK-ARROUND: Bug ID# 8620135. 
    [super viewDidAppear:animated]; 
} 

NOTA IMPORTANTE: Tenga en cuenta que este error solo aparece cuando se carga el UISplitViewController y no cada vez que aparece . Por lo tanto, para ver este error, asegúrese de que la aplicación haya finalizado antes.

+1

¿Puede presentar un error? ;) –

+0

la pregunta establece que está realizando el cambio en DetailViewController, ¿es el controlador correcto el que anula el método? –

+0

Ya informé del error – nacho4d

Respuesta

2

Hice una pregunta con una recompensa de 500 que seems to be the same thing you're facing.

Desde mi experiencia limitada que es mucho más fácil hacer un paisaje de sólo aplicación para el iPhone que un solo paisaje aplicación IPAD. No estoy seguro de por qué hay alguna diferencia, pero los pasos que Apple dice que debe tomar para que sea horizontal, solo que no funcionan por sí mismos.

+0

Creo que he encontrado una pista en ese hilo, Esto es lo que hice y funcionó, pero esto es seguramente un trabajo-alrededor. Esto no debería ser necesario, creo. Ver mi actualización2. – nacho4d

+0

Incluso duro, encontré la respuesta ... esta respuesta me llevó a ello. Así que gracias;) – nacho4d

0

Control hacia fuera este iPhone app in landscape mode, si no lo ha hecho. Iba a sugerir simplemente agregar UISupportedInterfaceOrientations a su Info.plist y especificar las dos orientaciones del paisaje. Pero, aparentemente, esto no es suficiente, según las respuestas a la pregunta citada.

1

Prueba esto (funciona):

-(BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation { 
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
     return YES; 
    } 
    else 
    { 
     return NO; 
    } 
} 
+0

modifique la condición 'if' según el modo en que lo desee. El código anterior lo restringe a la derecha. Cambie la marca 'if' a UIInterfaceOrientationLandscapeLeft para bloquear a la izquierda. Para ambos modos de paisaje, haz if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) – Sid

+0

No funcionó ... Esto es suficiente cuando no utilizo UISplitViewController, creo. – nacho4d

+0

'UIInterfaceOrientationIsLandscape (interfaceOrientation);' es Apple macro para hacer lo que dijiste en tu respuesta en breve. Entonces el asker ha hecho lo que dijiste que hiciera. –

0

Creo que esto es un error, me enfrentaba a este problema también. Es algo que ver con

UIInterfaceOrientationLandscapeLeft 

Para replicar esta situación:

1) Crear un nuevo proyecto iPad usando la plantilla UISplitViewController

2) Editar info.plist

Supported interface orientations 
-Landscape (left home button) 
-Landscape (right home button) 

3) DetailViewController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// return YES; 
NSLog(@"RotateToInterface:[%d] vs LandscapeLeft[%d]", interfaceOrientation, UIInterfaceOrientationLandscapeLeft); 
return interfaceOrientation == UIInterfaceOrientationLandscapeLeft; 
} 

4) Ejecútelo .... Verá una vista negra en blanco. y no importa cómo gires. "UIInterfaceOrientationLandscapeLeft" nunca detectado.

Por cierto, nacho4d 's añadiendo cheque BOOL solución alternativa está trabajando. Pulgares arriba :)

Cuestiones relacionadas