iOS 8 UIActionSheet ignora el controller de vista soportadoInterfaceOrientations y debería autorizar

Tengo una aplicación que se configura a través del file Plist para dar soporte a las orientaciones vertical, horizontal y horizontal (es decir, UISupportedInterfaceOrientations se establece en UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft y UIInterfaceOrientationLandscapeRight). Pero he limitado las orientaciones admitidas para simplemente retrato dentro de un controller de vista. Si presento una UIActionSheet en la vista del controller de vista y luego gire el dispositivo, la Hoja de UIAction rotará a la nueva orientación. Esto solo sucede en dispositivos con iOS 8 (GM Seed).

Me gustaría que UIActionSheet siga las reglas del controller de vista que contiene y no rotar. ¿Pensamientos?

No quiero que esto suceda: captura de pantalla http://oi58.tinypic.com/20tgto2.jpg

Código de ejemplo 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; } 

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; } 

Tuve un problema similar con iOS 8 y encontré una solución que podría ayudarte si quieres seguir con UIAlertView y UIActionSheet por ahora, en lugar de migrar a UIAlertController.

Mi aplicación permite Landscape y Portrait, pero solo en vistas seleccionadas. La mayoría de las veces solo permite Portrait. Quiero que UIAlertView y UIActionSheet aparezcan solo en Portrait (porque las vistas en las que están solo permiten Portrait).

Desafortunadamente, con iOS 8 las alertas y las hojas de acción ahora giran, ignorando el método shouldAutorotate del controller de vista raíz de la window. La vista y la barra de estado debajo de la alerta permanecen visibles en Portrait, incluso si la alerta gira. Si la alerta toma una input, el keyboard también permanece en Retrato, por lo que es realmente poco atractivo.

Estaba a punto de rendirse, pero finalmente encontré algo que funciona, incluso si no es ideal. Ponga esto en su delegado de la aplicación y adapte según sea necesario. Espero una solución mejor (probablemente solo con las nuevas classs). La comparación de cadenas aquí es obviamente lame, y esto anulará todo lo que haya establecido como orientación admitida en Info.plist. Al less 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í:

https://developer.apple.com/library/prerelease/iOS/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:supportedInterfaceOrientationsForWindow:

Se informó que UIAlertController reemplaza UIActionSheet en iOS 8.

"La nueva class UIAlertController reemplaza las classs UIActionSheet y UIAlertView como la forma preferida de mostrar alertas en su aplicación".

https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

 UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"hi" message:nil prefernetworkingStyle: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]; 

Agregando a la respuesta @ user3750435

Como el OP ha definido las máscaras de rotation que quiere en Info.plist , no necesitamos networkingefinir las máscaras aquí. UIApplication puede devolvernos esas máscaras a través de supportedInterfaceOrientationsForWindow:. Entonces, el método puede hacerse más simple así:

 -(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]; } 

– (NSUInteger) aplicación: (UIApplication *) aplicación soportadaInterfaceOrientationsForWindow: window (UIWindow *) {

 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