iphone - rotacion - ¿Cómo restringir mi aplicación al modo horizontal?
rotacion de pantalla iphone 7 (4)
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.
Intenté reemplazar el método shouldAutorotateToInterfaceOrientation:
DetailViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
pero 4.2 GM todavía tiene errores y no muestra la vista del controlador. ¿Qué otras opciones tengo?
Gracias por adelantado.
ACTUALIZACIÓN1
Ya he presentado un informe de error: ID de error # 8620135
Mi aplicación está casi terminada y tengo que encontrar un trabajo, ya que no creo que vayan a resolver esto antes de que salga oficialmente 4.2 (¡GM ya salió!)
Para volver a crear el error, simplemente use la plantilla SplitView y anule el método anterior en cualquiera de los UIViewControllers (RootViewController o DetailViewControllers)
ACTUALIZACIÓN2
He encontrado una solución alternativa. (Ver UPDATE3 para la solución completa)
Establezca UISupportedInterfaceOrientations solo para admitir Landscape, esto obligará a la aplicación a iniciarse en modo apaisado permitiendo que DetailViewController se inicie correctamente (de ahí que se muestre correctamente)
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
¡Pero si gira el dispositivo, cambia al modo de retrato!, Por lo que todavía es necesario anular shouldAutorotateToIntercafeOrientation
: como se shouldAutorotateToIntercafeOrientation
anteriormente
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 tu ayuda... ;)
ACTUALIZACIÓN3
Después de más pruebas, me di cuenta de que el trabajo de arriba 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 molesto iBug.
Paso 1: establece Info.plist como tal:
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
Paso 2 Establecer un nuevo indicador en DetailViewController.m o .h (desde SplitView Template)
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 su vista. Por lo tanto, para ver este error, asegúrese de que la aplicación haya finalizado antes.
Creo que este es un ERROR, también enfrenté este problema. Es algo que ver con
UIInterfaceOrientationLandscapeLeft
Para replicar esta situación:
1) Crea un nuevo proyecto de 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útalo .... Verás una vista negra en blanco. y no importa cómo gires. "UIInterfaceOrientationLandscapeLeft" nunca detectado.
Por cierto, nacho4d está agregando el trabajo de verificación BOOL Check. Pulgares hacia arriba :)
Hice una pregunta con una recompensa de 500 que parece ser lo mismo que estás enfrentando .
Desde mi experiencia limitada, es mucho más fácil crear una aplicación de iPhone solo para el paisaje que una aplicación para iPad de solo paisaje. 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.
Mira esta aplicación de iPhone en modo horizontal , si no lo has hecho aún. 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.
Prueba esto (funciona):
-(BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation {
if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
return YES;
}
else
{
return NO;
}
}