Мне удалось найти обходной путь / взломать / решить эту проблему. Я держал свое приложение заблокированным для портрета, но переопределил метод 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)
}
}
...
}
Похоже, что это решило экран, показывающий половину черного после входа и выхода из полноэкранного режима со встроенными видео. К сожалению, есть небольшая анимация, когда вы возвращаетесь из полноэкранного видео, но это небольшая жертва за очень странную ошибку.
Надеюсь, это поможет кому-то еще с этим (или похожими проблемами) и счастливым кодированием!