iOS 8 UIActionSheet ignora el controlador de vista compatibleInterfaceOrientations y shouldAutorotate
rotation ios8 (5)
Tengo una aplicación que está configurada a través del archivo plist para admitir las orientaciones vertical, horizontal izquierda y horizontal derecha (es decir, UISupportedInterfaceOrientations está establecida en UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft y UIInterfaceOrientationLandscapeRight). Pero he limitado las orientaciones admitidas a solo retratar dentro de un controlador de vista. Si presento una UIActionSheet en la vista del controlador de vista y luego giro el dispositivo, UIActionSheet gira a la nueva orientación. Esto solo ocurre en dispositivos que ejecutan iOS 8 (GM Seed).
Me gustaría que UIActionSheet siga las reglas del controlador de vista contenedora y no gire. ¿Pensamientos?
No quiero que esto suceda: captura de pantalla http://oi58.tinypic.com/20tgto2.jpg
Código de muestra de UIViewController:
- (IBAction)onTouch:(id)sender
{
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:@"hi"
delegate:nil
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Open", nil];
[actionSheet showInView:self.view];
}
#pragma mark - Rotation methods
- (BOOL)shouldAutorotate
{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
- Aplicación (NSUInteger): aplicación (UIApplication *) admitidaInterfaceOrientationsForWindow: (UIWindow *) window {
UIViewController *presentedViewController = window.rootViewController.presentedViewController;
if (presentedViewController) {
if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {
return UIInterfaceOrientationMaskPortrait;
}
}
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
gracias esto funciono para mi
Añadiendo a la respuesta de @ user3750435
Dado que el OP ha definido las máscaras de rotación que desea en la Info.plist
, no necesitamos redefinir las máscaras aquí. UIApplication puede devolvernos esas máscaras a través de UIApplication supportedInterfaceOrientationsForWindow: Entonces, el método se puede simplificar de la siguiente manera:
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
UIViewController *presentedViewController = window.rootViewController.presentedViewController;
if (presentedViewController) {
if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {
return UIInterfaceOrientationMaskPortrait;
}
}
return [application supportedInterfaceOrientationsForWindow:window];
}
Aquí está mi solución basada en la solución de Busrod con algunas modificaciones porque tuve algunos problemas en UIActionSheet usando su solución:
-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
UIViewController *presentedViewController = window.rootViewController.presentedViewController;
if (presentedViewController) {
if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {
return UIInterfaceOrientationMaskPortrait;
}
}
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
Se informó que UIAlertController reemplaza a UIActionSheet en iOS 8.
"La nueva clase UIAlertController reemplaza las clases UIActionSheet y UIAlertView como la forma preferida de mostrar alertas en su aplicación".
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"hi"
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
[alertController addAction:[UIAlertAction actionWithTitle:@"Open"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
// open something
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel"
style:UIAlertActionStyleCancel
handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
Tuve un problema similar con iOS 8 y encontré una solución alternativa que podría ayudarlo si quiere quedarse con UIAlertView y UIActionSheet por ahora, en lugar de migrar a UIAlertController.
Mi aplicación permite Paisaje y Retrato, pero solo en vistas seleccionadas. La mayoría de las veces solo permite retratos. Quiero que UIAlertView y UIActionSheet aparezcan solo como retrato (porque las vistas en las que se encuentran solo permiten retrato).
Desafortunadamente, con iOS 8, las alertas y las hojas de acción ahora giran, ignorando el método shouldAutorotate del controlador de vista raíz de la ventana. La vista y la barra de estado debajo de la alerta permanecen visibles en Vertical incluso si la alerta gira. Si la alerta recibe una entrada, el teclado también permanece en Retrato, por lo que es realmente poco atractivo.
Estaba a punto de rendirme, pero finalmente encontré algo que funciona, incluso si no es lo ideal. Ponga esto en su delegado de la aplicación y adáptese según sea necesario. Espero una mejor solución (probablemente solo esté usando las nuevas clases). La comparación de cadenas aquí es obviamente escasa, y esto anulará lo que haya establecido como orientación compatible en Info.plist. Al menos es algo para seguir ...
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
NSString *viewControllerClassName = [NSString stringWithUTF8String:object_getClassName(window.rootViewController)];
if ([viewControllerClassName isEqualToString:@"_UIAlertShimPresentingViewController"]) {
return UIInterfaceOrientationMaskPortrait;
}
else {
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
}
Lea más sobre este delegado aquí: