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

问题描述 投票:6回答:1

我想知道是否可以检测AVPlayerViewController视图中的播放控件何时出现或消失.我想在我的播放器上添加一个UI元素,必须跟随播放控件显示。只有在控件显示时才会出现,否则就会消失。

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

我的项目是用Swift做的。

ios swift avplayer avplayerviewcontroller
1个回答
0
投票

观察和响应播放变化的一个简单方法是使用 键值观测. 在你的情况下,观察AVPlayer的 timeControlStatusrate 财产。

如:。

{
  // 1. Setup AVPlayerViewController instance (playerViewController)

  // 2. Setup AVPlayer instance & assign it to playerViewController

  // 3. Register self as an observer of the player's `timeControlStatus` property

  // 3.1. Objectice-C
  [player addObserver:self
           forKeyPath:@"timeControlStatus"
              options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew // NSKeyValueObservingOptionOld is optional here
              context:NULL];

  // 3.2. Swift
  player.addObserver(self,
                     forKeyPath: #keyPath(AVPlayer.timeControlStatus),
                     options: [.old, .new], // .old is optional here
                     context: NULL)
}

为了得到状态变化的通知,你实现了 -observeValueForKeyPath:ofObject:change:context: 方法。每当 timeControlStatus 值变化。

// Objective-C
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary <NSKeyValueChangeKey, id> *)change
                       context:(void *)context
{
  if ([keyPath isEqualToString:@"timeControlStatus"]) {
    // Update your custom UI here depend on the value of `change[NSKeyValueChangeNewKey]`:
    // - AVPlayerTimeControlStatusPaused
    // - AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate
    // - AVPlayerTimeControlStatusPlaying
    AVPlayerTimeControlStatus timeControlStatus = (AVPlayerTimeControlStatus)[change[NSKeyValueChangeNewKey] integerValue];
    // ...

  } else {
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  }
}

// Swift
override func observeValue(forKeyPath keyPath: String?,
                           of object: Any?,
                           change: [NSKeyValueChangeKey : Any]?,
                           context: UnsafeMutableRawPointer?)
{
  if keyPath == #keyPath(AVPlayer.timeControlStatus) {
    // Deal w/ `change?[.newKey]`
  } else {
    super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
  }
}

最后最重要的一步当你不再需要观察者的时候,记得把它移走,一般在 -dealloc:

[playerViewController.player removeObserver:self forKeyPath:@"timeControlStatus"];

另外,您也可以观察AVPlayer的 rate 缘由 -play 相当于将比率值设为1.0,和 -pause 相当于将rate的值设置为0.0。

但在你的情况下,我认为 timeControlStatus 更有意义。


有一个官方的DOC可以进一步阅读(但只是 "准备播放"、"失败"&amp;"未知 "状态,在这里没有用)。"回应播放状态的变化" .

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.