2016-02-12 2 views
7

Это популярный вопрос, но я не мог найти решение, которое работало на Swift 2.Swift 2: поворот экрана только на полный экран видео

приложение только портрет. Но при просмотре полноэкранных видеороликов, таких как YouTube, пользователи должны иметь возможность поворачиваться в альбомную.

На Objective C, это было самым простым решением, и я использовал в течение длительного времени:

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; 

    } 

} 

Это позволяет все ориентации в то время как видео на полном экране. В противном случае, только портрет.

Но мне сложно провести эту работу над Swift. Можно ли поворачивать экран, когда полноэкранные видеоролики являются проигрывателями Swift?

ответ

6

Как насчет этого?

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 потенциально может вернуться nil, но isKindOfClass требует неопциональные AnyClass. Я проверяю, можно ли загружать каждый класс на платформу, добавляя классы, которые загружаются в массив, и затем повторяется через массив классов, проверяя, является ли presentedViewController одним из классов. Если это так, вернем .AllButUpsideDown. Если ни один класс не может быть загружен, либо presentedViewController не является ни одним из классов, мы возвращаем .Portrait.

+0

IOS-не вращается, но отлично работаю на прошивке 9. Спасибо! – tomDev

+0

Чтобы убедиться, что приложение вернется к портрету, лучше использовать «supportedInterfaceOrientations» вместо «supportedInterfaceOrientationsForWindow». Таким образом, когда видео отключено, ориентация автоматически вернется к портрету. – tomDev

+0

Спасибо, это было побочным продуктом спешки и использования автозаполнения ... Рад, что вы его работали. – JAL

2

Здесь решение для прошивки 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

Я использую этот код, основанный на других ответить

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 версии Natividad Lara Diaz ответа:

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

я обнаружил, что это решение работает очень легко и без каких-либо усилий для быстрых 3:

в AppDelegate.swift, добавьте эту функцию:

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 
    if window == self.window { 
     return .portrait 
    } else { 
     return .allButUpsideDown 
    } 
} 
Смежные вопросы