Полностью повернуть альбомный вид при воспроизведении фильма в VLCPlayer с помощью swift 3

Я хотел бы повернуть контроллер просмотра при воспроизведении фильма.
Мой вопрос может повторяться, но я пробовал много способов, когда обнаруживал переполнение стека. Но не все коды работают. Может я коды неправильно вставил.

 override var shouldAutorotate: Bool {
    return false
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        //return[.portrait,.landscapeRight]
    return .landscapeLeft
}
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    //return UIInterfaceOrientation.landscapeRight
    return .landscapeLeft
}

Я поместил этот код в файл vlcplayerviewcontroller.swift.

введите здесь описание изображения

Когда пользователь нажимает кнопку воспроизведения, он переходит к vlcplayerviewcontroller.swift, и я хотел бы автоматически показывать фильм в ландшафтном режиме. Я понятия не имею, как я могу это сделать.
Моя справочная ссылка: swift">Как заблокировать ориентацию одного контроллера представления в портретном режиме только в Swift.


person May Phyu    schedule 08.04.2017    source источник


Ответы (2)


У меня было решение в связанном ответе, но я скорректировал ландшафт. Выполните следующие шаги, и это даст вам желаемую функциональность.

Свифт 3

В AppDelegate:

/// set orientations you want to be allowed in this property by default
var orientationLock = UIInterfaceOrientationMask.all

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return self.orientationLock
}

В какой-то другой глобальной структуре или вспомогательном классе я создал AppUtility:

struct AppUtility {

    static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {

        if let delegate = UIApplication.shared.delegate as? AppDelegate {
            delegate.orientationLock = orientation
        }
    }

    /// Added method to adjust lock and rotate to the desired orientation
    static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {

        self.lockOrientation(orientation)

        UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
    }

}

Затем в нужном ViewController вы хотите заблокировать и повернуть ориентацию, как ваш контроллер фильма:

 override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // rotate and lock
    AppUtility.lockOrientation(.landscape, andRotateTo: .landscapeRight)

}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // Don't forget to reset when view is being removed
    AppUtility.lockOrientation(.all)
}
person bmjohns    schedule 10.04.2017
comment
Братан @bmjohns, где я могу разместить код AppUtility в приложении? Overlayviewcontroller.swift? - person May Phyu; 10.04.2017
comment
Вы можете добавить его куда угодно. Но я бы поместил его в новый файл Swift, чтобы вы могли получить доступ к коду в любом месте приложения на случай, если захотите повернуть и заблокировать в любое другое время. - person bmjohns; 10.04.2017
comment
Братан @bmjohns, Киноплеер не вращается :( - person May Phyu; 10.04.2017
comment
@MayPhyu Хорошо, вы можете предоставить больше информации? Что происходит, когда вы отлаживаете? Видите ли вы, что методы вызываются именно тогда, когда вы этого ожидаете? У вас есть все повороты, поддерживаемые в вашем plist? - person bmjohns; 10.04.2017
comment
Братан @bmjohns, проблема с ротацией решена. Но я столкнулся с другой проблемой stackoverflow.com/questions/43929485/ . Не могли бы вы посмотреть на это? - person May Phyu; 12.05.2017

Разрешить только портретную ориентацию устройства в настройках проекта. Добавьте эти строки в свой файл AppDelegate.

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if let rootViewController = self.topViewControllerWithRootViewController(rootViewController: window?.rootViewController) {
        if (rootViewController.isKind(of: your_class_name_for_rotate.self)) {
            // Unlock landscape view orientations for this view controller
            return .allButUpsideDown;
        }
    }

    // Only allow portrait (standard behaviour)
    return .portrait;
}

private func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController? {
    if (rootViewController == nil) { return nil }
    if (rootViewController.isKind(of: UITabBarController.self)) {
        return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UITabBarController).selectedViewController)
    } else if (rootViewController.isKind(of: UINavigationController.self)) {
        return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UINavigationController).visibleViewController)
    } else if (rootViewController.presentedViewController != nil) {
        return topViewControllerWithRootViewController(rootViewController: rootViewController.presentedViewController)
    }
    return rootViewController
}

Добавьте эту строку в метод viewDidLoad вашего view_controller_for_rotate

let value = UIInterfaceOrientation.landscapeLeft.rawValue
    UIDevice.current.setValue(value, forKey: "orientation")

И добавьте эти методы в тот же класс

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        UIDevice.current.setValue(Int(UIInterfaceOrientation.portrait.rawValue), forKey: "orientation")
    }
private func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.landscapeLeft
    }
    private func shouldAutorotate() -> Bool {
        return true
    }

Надеюсь, это поможет.

person i a m a g a m    schedule 11.04.2017
comment
Да братан. Вообще-то, мне предстоит поездка. Итак, я отвечу вам после того, как я протестирую его. Большое спасибо, братан. - person May Phyu; 11.04.2017