Swift – Как включить альбомную ориентацию в полноэкранном видео?

Я работаю над приложением для iPhone (Swift), и у меня есть WebView, который загружает видео с Youtube, и я хотел бы разрешить ландшафтный режим только тогда, когда видео отображается в полноэкранном режиме. Все мое приложение портретное и с вращением отключается, когда видео не воспроизводится в полноэкранном режиме. Я не хочу, чтобы пользователь мог повернуть приложение в альбомную ориентацию, когда видео на YouTube не в полноэкранном режиме, а только тогда, когда видео воспроизводится в полноэкранном режиме.

Я попробовал следующий код, но он не работает.

override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

person Marton Zeisler    schedule 05.06.2015    source источник


Ответы (2)


supportedInterfaceOrientations не был таким надежным решением и в моем случае. Что я сделал, так это получил текущий контроллер представления в методе делегата приложения application supportedInterfaceOrientationsForWindow и проверил, был ли этот контроллер контроллером представления, поддерживающим все ориентации, поэтому его возвращаемое значение было рассчитано на основе этого условия.

 func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {

    if let currentVC = getCurrentViewController(self.window?.rootViewController){

        //VideoVC is the name of your class that should support landscape
        if currentVC is VideoVC{

            return Int(UIInterfaceOrientationMask.All.rawValue)
        }
    }
    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

func getCurrentViewController(viewController:UIViewController?)-> UIViewController?{

     if let tabBarController = viewController as? UITabBarController{

        return getCurrentViewController(tabBarController.selectedViewController)
    }

    if let navigationController = viewController as? UINavigationController{
        return getCurrentViewController(navigationController.visibleViewController)
    }

    if let viewController = viewController?.presentedViewController {

        return getCurrentViewController(viewController)

    }else{

        return viewController
    }
}
person Zell B.    schedule 05.06.2015
comment
я должен поместить это в свой AppDelegate или в мой viewController? - person Marton Zeisler; 05.06.2015
comment
Благодарю. сейчас только одна ошибка, проверьте: postimg.org/image/5rntzarzz - person Marton Zeisler; 05.06.2015
comment
Исправлено, проверьте еще раз - person Zell B.; 05.06.2015
comment
еще раз спасибо. На этот раз ошибок нет, но приложение вылетает при загрузке: postimg.org/image/yqwd7jvw7 - person Marton Zeisler; 05.06.2015
comment
на этот раз без ошибок и сбоев, но когда я открываю видео на YouTube, я не могу повернуть его в альбомную ориентацию - person Marton Zeisler; 05.06.2015
comment
Удалили ли вы supportInterfaceOrientations из тестового VC? - person Zell B.; 05.06.2015
comment
да. Я сделал и в настройках проекта выбран только портретный режим. - person Marton Zeisler; 05.06.2015
comment
Вот в чем проблема, выбери все режимы в настройках проекта - person Zell B.; 05.06.2015
comment
Да, я сделал. Теперь все в портрете и не может быть повернуто, но и видео, к сожалению, не может быть повернуто. - person Marton Zeisler; 05.06.2015
comment
вот мой проект, просто нажмите на тест на панели вкладок, чтобы посмотреть видео: filedropper.com/motivateme - person Marton Zeisler; 05.06.2015
comment
@MartonZeisler обнаружил проблему, не знал, что вы используете tabbarcontroller, еще раз проверьте отредактированный ответ - person Zell B.; 05.06.2015
comment
да сейчас лучше. Но я хочу, чтобы пользователь мог поворачиваться в альбомную ориентацию только при воспроизведении видео. Прямо сейчас я могу поворачивать экран, даже когда даже не начинал смотреть видео. Экран должен быть разрешен только для поворота, когда видео веб-просмотра воспроизводится в полноэкранном режиме. Как только я закрою видео, я не смогу повернуть экран в альбомную ориентацию. postimg.org/image/q4hxrcd4f - person Marton Zeisler; 05.06.2015
comment
Удалось ли сделать ротацию только для видео? - person Amir; 21.07.2015
comment
повезло, ребята? У меня такая же проблема ... :( - person flo bee; 05.08.2015

Недавно я столкнулся с этой проблемой и, используя ответ Zell B., вот версия Swift 5, которая обнаружит AVPlayer и обновите настройки ориентации.

Просто скопируйте и вставьте приведенный ниже код в свой AppDelegate (редактирование не требуется):

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {

    if let currentVC = getCurrentViewController(self.window?.rootViewController), currentVC is AVPlayerViewController {
        return .allButUpsideDown
    }
    return .portrait
}

func getCurrentViewController(_ viewController: UIViewController?) -> UIViewController? {

    if let tabBarController = viewController as? UITabBarController {
        return getCurrentViewController(tabBarController.selectedViewController)
    }

    if let navigationController = viewController as? UINavigationController{
        return getCurrentViewController(navigationController.visibleViewController)
    }

    if let viewController = viewController?.presentedViewController {
        return getCurrentViewController(viewController)
    }
    
    return viewController
}
person Ryan Haycock    schedule 17.07.2020