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.
¿Puede presentar un error? ;) –
la pregunta establece que está realizando el cambio en DetailViewController, ¿es el controlador correcto el que anula el método? –
Ya informé del error – nacho4d