Swift 2: rotation de la pantalla solo en video de pantalla completa

Esta es una pregunta popular pero no pude encontrar ninguna solución que funcionara en Swift 2.

La aplicación es solo retrato. Pero mientras ve videos en pantalla completa, como YouTube, los usuarios deberían poder rotar al paisaje.

En el Objetivo C, esta fue la solución más fácil y utilicé durante mucho time:

AppDelegate file: static NSString * const VIDEO_CONTROLLER_CLASS_NAME_IOS7 = @"MPInlineVideoFullscreenViewController"; static NSString * const VIDEO_CONTROLLER_CLASS_NAME_IOS8 = @"AVFullScreenViewController"; - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ if ([[window.rootViewController presentedViewController] isKindOfClass:NSClassFromString(VIDEO_CONTROLLER_CLASS_NAME_IOS7)] || [[window.rootViewController presentedViewController] isKindOfClass:NSClassFromString(VIDEO_CONTROLLER_CLASS_NAME_IOS8)]) { return UIInterfaceOrientationMaskAllButUpsideDown; } else { return UIInterfaceOrientationMaskPortrait; } } 

Esto permite todas las orientaciones mientras el video está en pantalla completa. De lo contrario, solo retrato.

Pero estoy teniendo dificultades para hacer que esto funcione en Swift. ¿Es posible hacer que la pantalla gire cuando los videos de pantalla completa son reproductores en Swift?

¿Qué pasa con algo así?

 func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask { var classesToCheckFor = [AnyClass]() if let ios7Class = NSClassFromString("MPInlineVideoFullscreenViewController") { classesToCheckFor.append(ios7Class) } if let ios8Class = NSClassFromString("AVFullScreenViewController") { classesToCheckFor.append(ios8Class) } for classToCheckFor in classesToCheckFor { if (self.window?.rootViewController?.presentedViewController?.isKindOfClass(classToCheckFor) != nil) { return .AllButUpsideDown } } return .Portrait } 

NSClassFromString potencialmente puede devolver nil , pero isKindOfClass requiere una isKindOfClass no opcional. Comprobo si cada class se puede cargar en la plataforma, agregando las classs que se cargan a una matriz y luego repasando a través de la matriz de classs, comprobando si el presentedViewController es de cualquiera de las classs. Si es así, .AllButUpsideDown . .AllButUpsideDown . Si no se puede cargar ninguna class, o el .Portrait presentedViewController no es de ninguna class, entonces .Portrait . .Portrait .

Aquí la solución para iOS 10:

 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { if let presentedViewController = window?.rootViewController?.presentedViewController { let className = String(describing: type(of: presentedViewController)) if ["MPInlineVideoFullscreenViewController", "MPMoviePlayerViewController", "AVFullScreenViewController"].contains(className) { return UIInterfaceOrientationMask.allButUpsideDown } } return UIInterfaceOrientationMask.portrait 

}

Estoy usando este código basado en la respuesta de otros.

  func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { if let videoClass = NSClassFromString("AVFullScreenViewController"), self.window?.rootViewController?.presentedViewController?.isKind(of: videoClass) != nil { return .allButUpsideDown } return [.portrait] } 

Versión Swift 2.2 de Natividad Lara Diaz respuesta:

 if let presentedViewController = window?.rootViewController?.presentedViewController { let className = String(presentedViewController.dynamicType) if ["MPInlineVideoFullscreenViewController", "MPMoviePlayerViewController", "AVFullScreenViewController"].contains(className) { return UIInterfaceOrientationMask.All } } 

Encontré que esta solución funciona muy fácilmente sin ningún esfuerzo para swift 3:

en AppDelegate.swift, agregue esta function:

 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { if window == self.window { return .portrait } else { return .allButUpsideDown } }