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.UIApplicationDidChangeStatusBarOrientationNSNotification.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:处理方向更改而不在视图控制器上启用横向模式的主要内容,如果未能解决你的问题,请参考以下文章

更改方向IOS后视图边界不更新

如何在 iOS 7/8 的单个视图上禁用横向

仅在ios 6的一个视图中启用横向方向

在 Objective-C 中的 iOS 6 上强制横向方向

使用 UINavigationController iOS 6 弹回初始视图控制器时方向更改

强制视图仅支持横向模式