2016-02-12 4 views
7

Dies ist eine beliebte Frage, aber ich konnte keine Lösung finden, die 2. auf Swift arbeiteteSwift 2: Bildschirm-Rotation nur auf Vollbild-Video

Die App ist Portrait nur. Wenn Sie Vollbildvideos wie YouTube ansehen, sollten sich die Nutzer jedoch in die Landschaft drehen können.

auf Objective C, war dies die einfachste Lösung, und ich für eine lange Zeit verwendet:

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; 

    } 

} 

Diese alle Ausrichtungen ermöglicht, während das Video auf Vollbild ist. Ansonsten nur Portrait.

Aber ich habe eine harte Zeit, diese Arbeit auf Swift zu machen. Ist es möglich, den Bildschirm zu drehen, wenn Vollbildvideos auf Swift abgespielt werden?

Antwort

6

Was ist mit so etwas?

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 kann potenziell nil zurück, aber isKindOfClass erfordert einen nicht-optionalen AnyClass. Ich überprüfe, ob jede Klasse auf der Plattform geladen werden kann, indem ich die Klassen, die in ein Array geladen werden, hinzufüge und dann durch das Array von Klassen iteriere, um zu sehen, ob presentedViewController einer der beiden Klassen angehört. Wenn ja, geben wir .AllButUpsideDown zurück. Wenn keine der beiden Klassen geladen werden kann oder presentedViewController nicht einer der beiden Klassen entspricht, geben wir .Portrait zurück.

+0

iOS 8 nicht dreht, sondern funktioniert auf iOS 9. Dank! – tomDev

+0

Um sicherzustellen, dass die App zum Hochformat zurückkehrt, verwenden Sie besser "supportedInterfaceOrientations" anstelle von "supportedInterfaceOrientationsForWindow". Auf diese Weise wird die Ausrichtung beim Beenden des Videos automatisch auf Hochformat zurückgesetzt. – tomDev

+0

Danke, das war ein Nebenprodukt von rauschen und Autocomplete verwenden ... Froh, dass es funktioniert hat. – JAL

2

Hier ist die Lösung für 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 

}

0

Ich verwende diesen Code basiert auf andere antworten

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] 
    } 
1

Swift 2.2 Version von Natividad Lara Diaz Antwort:

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

fand ich, dass diese Lösung funktioniert sehr einfach und ohne Anstrengungen für eine schnelle 3:

in AppDelegate.swift, fügen Sie diese Funktion:

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