更新:该问题与AVPlayerControllerView无关,请在下面查看我的答案。开头的类AVTouchIgnoringView
的名称使我感到困惑,但这也是思考问题的错误路径。
===
众所周知,iOS 9不赞成使用Media Player
框架,因此我决定在新项目中尝试使用AVKit
。我的任务是显示嵌入在“收藏夹视图”标头(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
}
这种工作方式可以使播放器按预期方式工作,但是我遇到一个奇怪的问题:其默认界面无法响应触摸。为了理解这个问题,我看了一下视图调试器,发现顶部的
AVTouchIgnoringView
阻塞了该接口:所以我的问题是:
AVTouchIgnoringView
是什么?为什么会干扰视频播放器界面?以及如何摆脱它?也许有一些我看不到的非常明显的原因?感谢您的任何帮助!
最佳答案
好的,解决了这个问题,它与AVPlayerViewController
完全无关。原因是在我的情况下,玩家视图容器是UIImageView
的子类,overrides userInteractionEnabled
变为NO:
此属性是从UIView父类继承的。此类将此属性的默认值更改为NO。
因此将此属性设置为YES可以解决此问题。不知道我应该保留这个问题还是删除它,以免使读者感到困惑。