ios - iPhoneX 中的 AVPlayerViewController 控件

标签 ios xcode swift4 avplayer avplayerviewcontroller

我找不到在 iPhoneX 中显示 AVPlayerViewController 控件的解决方案。通过使用 AVPlayerViewController.gravity = .aspectfill 显示控件,但视频会填满整个屏幕并剪辑剩余部分。任何想法??这是我的代码:

func loadVideoURL () {

    let fileURL = URL.init(string: (exerciseDetailsObj?.video_file)!)
    avPlayer = AVPlayer(url: fileURL!)

    let playerController = AVPlayerViewController()
    playerController.player = avPlayer
    playerController.view.frame = CGRect(x: 0, y: 0, width:viewPlayerContainer.bounds.size.width, height: viewPlayerContainer.bounds.size.height)
    playerController.showsPlaybackControls = false
    avPlayerController = playerController

    self.addChild(avPlayerController)
    viewPlayerContainer.addSubview(avPlayerController.view)
    viewPlayerContainer.sendSubviewToBack(avPlayerController.view)
    avPlayerController.didMove(toParent: self)

    avPlayerController.addObserver(self, forKeyPath: "videoBounds", options: NSKeyValueObservingOptions.new, context: nil)
   }
}

 func enterFullscreen(playerViewController: AVPlayerViewController) {
    playerViewController.showsPlaybackControls = true  //not dispalyed in iphonX

    let selectorName: String = {
        if #available(iOS 11.3, *) {
            return "_transitionToFullScreenAnimated:interactive:completionHandler:"
        } else if #available(iOS 11, *) {
            return "_transitionToFullScreenAnimated:completionHandler:"
        } else {
            return "_transitionToFullScreenViewControllerAnimated:completionHandler:"
        }
    }()
    let selectorToForceFullScreenMode = NSSelectorFromString(selectorName)

    if playerViewController.responds(to: selectorToForceFullScreenMode) {
        playerViewController.perform(selectorToForceFullScreenMode, with: true, with: nil)
    }
}

func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
{
    if keyPath == "videoBounds"
    {
        if let rect = change?[.newKey] as? NSValue
        {
            if let newrect = rect.cgRectValue as CGRect?
            {
                if newrect.size.height <= 214
                {
                 avPlayerController.showsPlaybackControls = false
                }
            }
        }
    }
}

最佳答案

看看这个。请引用代码并相应更改为您的代码。

@IBOutlet weak var videoPlayerView: UIView! // Take UIview on storyboard on which you want to display video

var player: AVPlayer?
var playerController = AVPlayerLayer()

override func viewDidLoad()
{
        self.videoPlayerView.layer.insertSublayer(playerController, at: 0)

        player = AVPlayer(url: videoUrl!)

        playerController.player = player

self.player?.play()
}


override func viewDidLayoutSubviews() {
        playerController.videoGravity = AVLayerVideoGravity(rawValue: AVLayerVideoGravity.resizeAspectFill.rawValue)
        playerController.frame = self.videoPlayerView.bounds
    }

关于ios - iPhoneX 中的 AVPlayerViewController 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53293703/

相关文章:

objective-c - Tesseract OCR 只有数字

swift - 类 RTCCVPixelBuffer 在两者中都实现,将使用两者之一。哪个是未定义的

ios - 3D Touch 应用内 "Quick Actions"

ios - 本地化 iOS App 的 "What' s new in this version”via iTunesConnect

ios - 如何在 iOS 8 上强制启动图像而不是启动屏幕?

iOS 保存内购数据并应对越狱

ios - 如何安装更新的 swift-tools-version?

ios - 无法找到 BLE 外设

ios - 快速更改方向时如何显示 View ?

swift - 如何使用 Swift 的 Codable 编码成字典?