如何使用 AVPlayerViewController 检测播放控件显示的切换?

Mar*_*tin 9 ios avplayer swift avplayerviewcontroller

我想知道是否可以检测播放控件何时从 AVPlayerViewController 视图中出现或消失。我正在尝试在我的播放器上添加一个 UI 元素,该元素必须遵循播放控件显示。仅在显示控件时出现,否则消失

我似乎没有找到任何可以在 AVPlayerViewController 上观察到的值来实现这一点,也没有任何回调或委托方法。

我的项目在 Swift 中。

Sim*_*lin 1

根据另一篇文章的评论设法找到了一些可行的东西(至少对于 iOS)。可能不稳定,可能不适用于所有平台。

创建一个 AVPlayerViewController 子类并在其子视图之一上设置一个观察者,检查隐藏属性的更改。尝试以一种避免明确使用任何标记为私有的方式来避免任何应用程序商店问题。下面的代码供其他正在寻找相同内容的人使用,如果您发现更好的内容,请告诉我

import AVKit

protocol CustomAVPlayerViewControllerDelegate: AnyObject {
    
    func playbackControlsChanged(visible: Bool)
}

class CustomAVPlayerViewController: AVPlayerViewController {
    
    private var viewToMonitor: UIView? = nil
    private var previousValue = true
    
    public weak var customDelegate: CustomAVPlayerViewControllerDelegate? = nil
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let container = view.subviews.first
        viewToMonitor = container?.subviews.last
        previousValue = viewToMonitor?.isHidden ?? true
        
        viewToMonitor?.addObserver(self, forKeyPath: "hidden", context: nil)
    }
    
    deinit {
        viewToMonitor?.removeObserver(self, forKeyPath: "hidden")
    }
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        
        // Check if its the correct element and avoid double trigger
        if keyPath == "hidden", let v = viewToMonitor, previousValue != v.isHidden {
            previousValue = v.isHidden
            customDelegate?.playbackControlsChanged(visible: !v.isHidden)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)