YouTube приложение iFrame в приложении iOS заставляет половину экрана на go черный после полного экрана - PullRequest
1 голос
/ 13 января 2020

У меня WKWebView в моем UIViewController, и я встраиваю видео на YouTube (используя iFrame) в html вместе с текстом. Когда я запускаю видео, оно работает так, как задумано, оно открывается в полноэкранном режиме, я могу поворачивать альбомную ориентацию, воспроизводится нормально и т. Д. c. Проблема заключается в том, когда я закрываю видео. Мое приложение заблокировано для портретной ориентации, и при возврате из видео приложение имеет наполовину черный экран, наполовину мое приложение и вид, который по-прежнему наполовину является моим приложением, выглядит в горизонтальной плоскости (слишком большой для ширины).

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

1. Launch WKWebView with youtube iframe
2. Click to launch video (video plays full screen)
3. Rotate device to either landscape rotations.
4. Close the player
This is where you notice that half the application is black and the other half looks to be portrait orientation in landscape layout.

Когда я проверяю виды до и после, они имитируют, как будто приложение перешло в альбомный режим, но устройство находится в портретном режиме. (Просмотр начинается с 414x862. После просмотра и поворота с видео и возврата к виду оно отображается как 862x414)

Я не совсем уверен, что здесь происходит. Мысли?

Заранее спасибо

1 Ответ

0 голосов
/ 15 января 2020

Мне удалось найти обходной путь / взломать / решить эту проблему. Я держал свое приложение заблокированным для портрета, но переопределил метод AppDelegate для разрешенных ориентаций.

class AppDelegate: UIResponder, UIApplicationDelegate {

    ...

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

    ...

}

Я создал OrientationManager, который был просто вспомогательным классом, чтобы позволить мне вызывать повороты и изменять допустимые ориентации.

class OrientationManager {
    /// The currently allowed orientations of the application (default: .portrait)
    static var allowedOrientations: UIInterfaceOrientationMask = .portrait

    /**
     * Method to force the current orientation of the device.
     *
     * - Parameter orientation: The orientation to change to.
     *
     * - Warning: This method uses setValue(_, forKey:) which accesses values that may change in the future
     */
    static func forceOrientation(_ orientation: UIInterfaceOrientation) {
        let orientationRawValue = orientation.rawValue
        UIDevice.current.setValue(orientationRawValue, forKey: "orientation")
        UINavigationController.attemptRotationToDeviceOrientation()
    }
}

Последнее, что мне нужно было сделать, это выяснить, когда видео входило и выходило из полноэкранного режима. Я обнаружил некоторые уведомления, которые, казалось, надежно срабатывали, когда видео входило и выходило из полноэкранного режима. Когда это происходит, я включаю возможность поворота вида, что позволяет ему go перемещаться за полноэкранным видео. Как только видео закрыто, мой вид (теперь, к сожалению) отображается в альбомной ориентации, и я могу затем принудительно установить ориентацию и снова установить его в портретное.

В UIViewController с веб-просмотром:

class WebViewWithVideoViewController: UIViewController {

    ...
    // MARK: Properties
    var videoDidFullScreenNotification: NSObjectProtocol?
    var videoDidMinimizeNotification: NSObjectProtocol?
    ...

    // MARK: Lifecycle
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.beginObserving()
    }

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

        self.endObserving()
    }

    // MARK: Observers

    func beginObserving() {
        // This is a solution to the video causing a half black screen when the device is rotated to landscape.
        // The outline of the solution is that when the video is put into full screen mode, we update the
        // available orientations to include both landscape directions. Upon the video being closed,
        // we force the device orientation back to portrait and then lock it back to portrait only.
        // This seems to work because the UIViewController is actually in landscape once complete
        // and then it animates back to the portrait orientation and seems to keep the proper ratios
        // and sizes.
        if self.videoDidFullScreenNotification == nil {
            self.videoDidFullScreenNotification = NotificationCenter.default.addObserver(
                forName: UIWindow.didBecomeVisibleNotification,
                object: self.view.window,
                queue: nil
            ) { notification in
                OrientationManager.allowedOrientations = .allButUpsideDown
            }
        }

        if self.videoDidMinimizeNotification == nil {
            self.videoDidMinimizeNotification = NotificationCenter.default.addObserver(
                forName: UIWindow.didBecomeHiddenNotification,
                object: self.view.window,
                queue: nil
            ) { notification in
                OrientationManager.forceOrientation(.portrait)
                OrientationManager.allowedOrientations = .portrait
            }
        }
    }

    func endObserving() {
        if let videoDidFullScreenNotification = self.videoDidFullScreenNotification {
            NotificationCenter.default.removeObserver(videoDidFullScreenNotification)
        }

        if let videoDidMinimizeNotification = self.videoDidMinimizeNotification {
            NotificationCenter.default.removeObserver(videoDidMinimizeNotification)
        }
    }

    ...
}

Похоже, что это решило экран, показывающий половину черного после входа и выхода из полноэкранного режима со встроенными видео. К сожалению, есть небольшая анимация, когда вы возвращаетесь из полноэкранного видео, но это небольшая жертва за очень странную ошибку.

Надеюсь, это поможет кому-то еще с этим (или похожими проблемами) и счастливым кодированием!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...