2016-02-12 15 views
7

Questa è una domanda popolare, ma non sono riuscito a trovare alcuna soluzione che ha lavorato su Swift 2.Swift 2: la rotazione dello schermo solo sul video a schermo intero

L'app è unico ritratto. Ma mentre guardi video a schermo intero, come YouTube, gli utenti dovrebbero essere in grado di ruotare in orizzontale.

Su Objective C, questa è stata la soluzione più facile e ho usato per molto tempo:

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; 

    } 

} 

Questo consente a tutti gli orientamenti, mentre il video è a schermo intero. Altrimenti, solo Portrait.

Ma sto attraversando un periodo difficile per eseguire questo lavoro su Swift. È possibile ruotare lo schermo quando i video a schermo intero sono riprodotti su Swift?

risposta

6

E qualcosa di simile?

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 potenzialmente possono restituire nil, ma richiede un isKindOfClass non facoltativa AnyClass. Sto verificando se ogni classe può essere caricata sulla piattaforma, aggiungendo le classi che vengono caricate su un array e quindi eseguendo l'iterazione attraverso l'array di classi, controllando se lo presentedViewController è di entrambe le classi. Se lo è, restituiamo .AllButUpsideDown. Se nessuna delle due classi può essere caricata, o l'unità presentedViewController non è di nessuna classe, restituiamo .Portrait.

+0

iOS 8 non ruota, ma funziona benissimo su iOS 9. Grazie! – tomDev

+0

Per assicurarsi che l'applicazione ritorni in verticale, è meglio utilizzare "supportatoInterfaceOrientations" anziché "supportedInterfaceOrientationsForWindow". In questo modo, quando il video viene rimosso, l'orientamento tornerà automaticamente al ritratto. – tomDev

+0

Grazie, quello era un sottoprodotto di correre e usare il completamento automatico ... Sono felice che tu abbia funzionato. – JAL

2

Ecco la soluzione per 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

sto usando questo codice sulla base di altri rispondere

versione
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 di Natividad Lara Diaz risposta:

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

ho scoperto che questa soluzione funziona molto facilmente senza sforzi per SWIFT 3:

in AppDelegate.swift, aggiungere questa funzione:

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