嵌入式 AVPlayerControllerView 添加 AVTouchIgnoringView 阻止默认播放器的界面
Embedded AVPlayerControllerView adds AVTouchIgnoringView blocking default player's interface
更新:这个问题与 AVPlayerControllerView 无关,请看下面我的回答。 class AVTouchIgnoringView
的名称一开始让我很困惑,但那也是一个错误的思考问题的路径。
===
众所周知,Media Player
框架在 iOS 9 中已被弃用,因此我决定在我的新项目中尝试使用 AVKit
。我的任务是显示嵌入在 collection view' 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
}
这种效果很好,播放器按预期工作,但我遇到了一个奇怪的问题:它的默认界面不响应触摸。为了理解这个问题,我查看了视图调试器,我发现顶部的 AVTouchIgnoringView
阻塞了界面:
所以我的问题如下:AVTouchIgnoringView
是什么,为什么它会干扰视频播放器界面?以及如何摆脱它?也许有一些我只是没有看到的非常明显的原因?
感谢您的帮助!
好的,问题解决了,而且与AVPlayerViewController
完全无关。原因是我的播放器视图容器是 UIImageView
的子类,overrides userInteractionEnabled
到 NO:
This property is inherited from the UIView parent class. This class changes the default value of this property to NO.
所以将此属性设置为 YES 解决了这个问题。不确定我是否应该保留这个问题或将其删除,因为 reader.
另一个可能的答案是玩家在一个高度不明确的滚动视图中。我 运行 进入这个并尝试设置用户交互和框架但没有改变。一旦我在内容上设置了静态高度,它就可以正常工作。
更新:这个问题与 AVPlayerControllerView 无关,请看下面我的回答。 class AVTouchIgnoringView
的名称一开始让我很困惑,但那也是一个错误的思考问题的路径。
===
众所周知,Media Player
框架在 iOS 9 中已被弃用,因此我决定在我的新项目中尝试使用 AVKit
。我的任务是显示嵌入在 collection view' 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
}
这种效果很好,播放器按预期工作,但我遇到了一个奇怪的问题:它的默认界面不响应触摸。为了理解这个问题,我查看了视图调试器,我发现顶部的 AVTouchIgnoringView
阻塞了界面:
所以我的问题如下:AVTouchIgnoringView
是什么,为什么它会干扰视频播放器界面?以及如何摆脱它?也许有一些我只是没有看到的非常明显的原因?
感谢您的帮助!
好的,问题解决了,而且与AVPlayerViewController
完全无关。原因是我的播放器视图容器是 UIImageView
的子类,overrides userInteractionEnabled
到 NO:
This property is inherited from the UIView parent class. This class changes the default value of this property to NO.
所以将此属性设置为 YES 解决了这个问题。不确定我是否应该保留这个问题或将其删除,因为 reader.
另一个可能的答案是玩家在一个高度不明确的滚动视图中。我 运行 进入这个并尝试设置用户交互和框架但没有改变。一旦我在内容上设置了静态高度,它就可以正常工作。