2016-02-12 29 views
7

Jest to popularne pytanie, ale nie mogłem znaleźć rozwiązania, które działało na Swift 2.Swift 2: obracanie ekranu tylko na pełnym ekranie wideo

Ta aplikacja jest tylko portretowa. Ale podczas oglądania pełnoekranowych filmów, takich jak YouTube, użytkownicy powinni mieć możliwość obracania się do krajobrazu.

na obiektywnych C, było to najłatwiejsze rozwiązanie i używany przez dłuższy czas:

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; 

    } 

} 

Pozwala to na wszystkie kierunki, podczas gdy film jest na pełnym ekranie. W przeciwnym razie, tylko Portret.

Ale ciężko mi pracować nad Swift. Czy ekran można obracać, gdy filmy pełnoekranowe są odtwarzane w Swift?

Odpowiedz

6

Co powiesz na coś takiego?

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 potencjalnie mogą wrócić nil, ale isKindOfClass wymaga non-opcjonalnego AnyClass. Sprawdzam, czy każda klasa może być załadowana na platformę, dodając klasy, które są ładowane do tablicy, a następnie iterując przez tablicę klas, sprawdzając, czy klasa presentedViewController jest klasą. Jeśli tak, zwracamy .AllButUpsideDown. Jeśli żadna klasa nie może być załadowana, lub presentedViewController 's nie należy do żadnej z klas, wówczas zwracamy .Portrait.

+0

iOS 8 nie obraca się, ale działa świetnie na iOS 9. Dzięki! – tomDev

+0

Aby upewnić się, że aplikacja powróci do portretu, lepiej użyć "supportedInterfaceOrientations" zamiast "supportedInterfaceOrientationsForWindow". W ten sposób, gdy wideo zostanie odrzucone, orientacja automatycznie powróci do portretu. – tomDev

+0

Dzięki, to był produkt uboczny pośpiechu i używania autouzupełniania ... Cieszę się, że to działa. – JAL

2

Oto rozwiązanie dla 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

Używam tego kodu na podstawie innych odpowie

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 wersję Natividad Lara Diaz odpowiedź:

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

I okazało się, że to rozwiązanie działa bardzo łatwo, bez wysiłku na szybkie 3:

w AppDelegate.swift, dodać tę funkcję:

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