嵌入式AVPlayerControllerView添加了AVTouchIgnoringView阻止默认播放器的界面

mik*_*ejd 4 ios avkit avplayerviewcontroller

更新:该问题与AVPlayerControllerView无关,请参阅下面的答案.班级的名字AVTouchIgnoringView在一开始就让我困惑,但这也是思考问题的错误途径.

===

众所周知,Media Player在iOS 9中不推荐使用框架,因此我决定尝试AVKit在我的新项目中使用.我的任务是显示嵌入在集合视图'header(UICollectionReusableView)中的视频播放器,下面有一些任意单元格.

这是我在代码中这样做的方式:

override func viewDidLoad() {
  super.viewDidLoad()

  apiManager.loadVideo() { video in
    let player = AVPlayer(URL: video.url)
    self.playerViewController.view.hidden = true
    self.playerViewController.player = player
    self.addChildViewController(self.playerViewController)

    headerView.videoContainerView.addSubview(self.playerViewController.view)
    Cartography.layout(self.playerViewController.view,
      headerView.videoContainerView) { (v1, v2) in
        v1.leading == v2.leading
        v1.bottom == v2.bottom
        v1.trailing == v2.trailing
        v1.top == v2.top
    }

    self.playerViewController.didMoveToParentViewController(self)
    self.playerViewController.addObserver(self,
      forKeyPath: KeyPath.ReadyForDisplay, options: nil, context: nil)
  }
}

override func observeValueForKeyPath(keyPath: String,
  ofObject object: AnyObject, change: [NSObject : AnyObject],
  context: UnsafeMutablePointer<Void>) {
    if keyPath == KeyPath.ReadyForDisplay {
      dispatch_async(dispatch_get_main_queue()) {
      self.finishConstructingInterface()
    }
  }
}

func finishConstructingInterface() {
  if playerViewController.readyForDisplay == false {
    return
  }
  playerViewController.removeObserver(self, forKeyPath: KeyPath.ReadyForDisplay)
  playerViewController.view.hidden = false
  playerViewController.view.userInteractionEnabled = true
}
Run Code Online (Sandbox Code Playgroud)

这种作品,播放器按预期工作,但我遇到一个奇怪的问题:它的默认界面不响应触摸.为了解这个问题,我看了一下view debugger,我在那里找到AVTouchIgnoringView了阻塞界面的顶部:

AVTouchIgnoringView位于顶部

所以我的问题是:这是什么AVTouchIgnoringView以及它为什么会干扰视频播放器界面?以及如何摆脱它?也许有一些非常明显的原因,我只是没有看到?

感谢您的任何帮助!

mik*_*ejd 5

好了,解决了这个问题,它是完全无关AVPlayerViewController.原因是我的案例中的玩家视图容器是其子类UIImageView,它覆盖 userInteractionEnabled了NO:

此属性继承自UIView父类.此类将此属性的默认值更改为NO.

因此,将此属性设置为YES可解决此问题.不确定我是应该保留这个问题还是删除它,因为这有点让读者感到困惑.

  • 收下.我经历了你所做的相同的调试过程,所以"AVTouchIgnoringView"就是让我来到这里并简短地修复我的原因.谢谢!:-) (2认同)