La aplicación gira cuando UIAlertView se muestra en iOS 8

Estoy trabajando en una aplicación que se utiliza principalmente en modo vertical (a exception de unas pocas vistas). Nos encontramos con un problema en iOS 8 donde la aplicación puede rotar cuando se muestra un UIViewAlert , aunque el controller de vista de subyacente solo admite la orientación vertical y su método shouldAutorotate devuelve NO. La rotation no está completa, ya que UIAlertView gira a paisaje, pero la vista subyacente permanece en modo vertical. No hay problema si ejecutamos la aplicación en iOS 7.

Sé que UIAlertView ha quedado en desuso en iOS 8 y que ahora deberíamos utilizar UIAlertController . Sin embargo, realmente me gustaría evitar tener que replacelo ya que esto significaría editar más de 50 classs que usan UIAlertView y UIAlertViewDelegate . Además, seguimos admitiendo iOS 7, así que tendría que tener ambas soluciones. Preferiría solo tener que hacer esto una vez, cuando hagamos el cambio completo a iOS 8.

Simplemente coloque esto en su implementación UIApplicationDelegate

Rápido

 @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int { if window == self.window { return Int(UIInterfaceOrientationMask.All.rawValue) // Mask for all supported orientations in your app } else { return Int(UIInterfaceOrientationMask.Portrait.rawValue) // Supported orientations for any other window (like one created for UIAlert in iOS 8) } } } 

C objective

 @implementation AppDelegate - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if (window == self.window) { return UIInterfaceOrientationMaskAll; // Mask for all supported orientations in your app } else { return UIInterfaceOrientationMaskPortrait; // Supported orientations for any other window (like one created for UIAlert in iOS 8) } } @end 

En su delegado de la aplicación: (Esto es solo un truco. Me alegraría ver una solución más elegante)

 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { UIViewController *presentedViewController = window.rootViewController.presentedViewController; if (!presentedViewController) { return UIInterfaceOrientationMaskAllButUpsideDown; } Class alertControllerClass = NSClassFromString(@"UIAlertController"); if (!alertControllerClass) { return UIInterfaceOrientationMaskAllButUpsideDown; } if ([presentedViewController isKindOfClass:alertControllerClass] || [presentedViewController.presentedViewController isKindOfClass:alertControllerClass]) { return UIInterfaceOrientationMaskPortrait; } return UIInterfaceOrientationMaskAllButUpsideDown; } 

Estaba enfrentando el problema similar con mi aplicación, lo resolví subclassando el

UIAlertViewController

y la implementación de estos methods de orientación

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight)); } - (BOOL)shouldAutorotate { return YES; } - (UIInterfaceOrientation)prefernetworkingInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeRight; }