iOS:处理方向更改而不在视图控制器上启用横向模式
Posted
技术标签:
【中文标题】iOS:处理方向更改而不在视图控制器上启用横向模式【英文标题】:iOS: Handle Orientation change without enabling landscape mode on View Controller 【发布时间】:2018-04-22 00:01:37 【问题描述】:我的 Swift 应用程序的视图控制器始终固定为纵向模式,但视图控制器有一个嵌入式 AV 视频播放器(作为子视图控制器添加),当设备方向更改为横向时,它应该切换到全屏模式。
我面临的问题是,如果我不在 View Controller 上启用横向模式,我将无法检测到方向变化(尝试使用 NSNotification.Name.UIApplicationDidChangeStatusBarOrientation
、NSNotification.Name.UIDeviceOrientationDidChange
),因此无法触发播放器全屏。
我希望我的视图控制器对方向变化做出反应,因为它会导致我的自动布局视图拉伸并适应屏幕尺寸变化,但同时我希望方向更改到达子视图控制器,即视频播放器,以便它可以处理全屏模式/内联模式之间的切换。
if let playerVC = createPlayerViewController() as? (UIViewController & MyEmbedPlayer)
// Set up events delegate.
self.playerViewController = playerVC
self.playerViewController?.setEventsDelegate(self)
// PlayerViewController added as child of View Controller
self.addChildViewController(self.playerViewController!)
let managedPlayerView = self.playerViewController?.view
managedPlayerView?.removeFromSuperview()
managedPlayerView?.frame = self.playerView.bounds
managedPlayerView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
playerView.addSubview(managedPlayerView!)
self.playerViewController?.didMove(toParentViewController: self)
self.playerViewController?.setVideoURL(streamURL)
TL;DR:我不希望我的屏幕元素对方向变化做出反应,但仍希望我的子视图控制器接收方向变化事件。
【问题讨论】:
你只需要AVPlayerViewController
支持风景
@a.masri 是的,我正在尝试让播放器视图控制器支持横向,并将其父视图控制器保留为纵向。但是我看到当玩家进入横向全屏并返回父视图控制器时,父视图控制器也以横向呈现。
【参考方案1】:
试试这个代码
class MYAVPlayerViewController:AVPlayerViewController
override var supportedInterfaceOrientations: UIInterfaceOrientationMask
return .all // or you can replace this landscape
调用你的控制器
let myAVPlayerViewController = MYAVPlayerViewController()
myAVPlayerViewController.player = player
self.present(myAVPlayerViewController, animated: true)
self.player.play()
注意:请确保在 General -> device 中只检查纵向 方向
【讨论】:
以上是关于iOS:处理方向更改而不在视图控制器上启用横向模式的主要内容,如果未能解决你的问题,请参考以下文章
在 Objective-C 中的 iOS 6 上强制横向方向