Ios 嵌入式AVPlayerController视图添加了AVTouchIgnoringView阻止默认播放器';s接口
更新:该问题与AVPlayerController视图无关,请参见下面我的答案。一开始,我对类的名称感到困惑,但这也是思考问题的一个错误途径 === 众所周知,Ios 嵌入式AVPlayerController视图添加了AVTouchIgnoringView阻止默认播放器';s接口,ios,avkit,avplayerviewcontroller,Ios,Avkit,Avplayerviewcontroller,更新:该问题与AVPlayerController视图无关,请参见下面我的答案。一开始,我对类的名称感到困惑,但这也是思考问题的一个错误途径 === 众所周知,Media Player框架在iOS 9中不受欢迎,因此我决定在我的新项目中尝试使用AVKit。我的任务是用下面的一些任意单元格显示嵌入到“收藏视图”标题(UICollectionReusableView)中的视频播放器 这就是我在代码中的实现方式: override func viewDidLoad() { super.viewDi
Media Player
框架在iOS 9中不受欢迎,因此我决定在我的新项目中尝试使用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
}
override func viewDidLoad(){
super.viewDidLoad()
apimager.loadVideo(){video in
let player=AVPlayer(URL:video.URL)
self.playervewcontroller.view.hidden=true
self.playervewcontroller.player=player
self.addChildViewController(self.playerViewController)
headerView.videoContainerView.addSubview(self.playerViewController.view)
制图.布局(self.playervewcontroller.view,
headerView.videoContainerView){(v1,v2)在
v1.leading==v2.leading
v1.bottom==v2.bottom
v1.trailing==v2.trailing
v1.top==v2.top
}
self.playervewcontroller.didMoveToParentViewController(self)
self.playervewcontroller.addObserver(self,
forKeyPath:KeyPath.ReadyForDisplay,选项:nil,上下文:nil)
}
}
重写函数observeValueForKeyPath(键路径:字符串,
ofObject对象:AnyObject,更改:[NSObject:AnyObject],
上下文:unsafemeutablepointer){
如果keyPath==keyPath.ReadyForDisplay{
dispatch\u async(dispatch\u get\u main\u queue()){
self.finishConstructingInterface()
}
}
}
func finishConstructingInterface(){
如果playervewcontroller.readyForDisplay==false{
返回
}
playerViewController.removeObserver(self,forKeyPath:KeyPath.ReadyForDisplay)
playervewcontroller.view.hidden=false
playerViewController.view.userInteractionEnabled=true
}
这种工作方式,播放器可以按预期工作,但我遇到了一个奇怪的问题:它的默认界面不响应触摸。为了理解这个问题,我查看了view debugger,发现顶部有AVTouchIgnoringView
阻塞了接口:
所以我的问题是:什么是AVTouchIgnoringView
,为什么它会干扰视频播放器界面?如何摆脱它?也许有一些很明显的原因我就是不明白
谢谢你的帮助 好的,解决了问题,它与
avplayervewcontroller
完全无关。原因是在我的例子中,播放器视图容器是UIImageView
的一个子类,它userInteractionEnabled
为NO:
此属性从UIView父类继承。此类将此属性的默认值更改为“否”
因此,将此属性设置为“是”解决了此问题。我不确定是否应该保留或删除这个问题,因为这会让读者有些困惑。另一个可能的答案是,播放器位于一个高度不明确的滚动视图中。我遇到了这个问题,尝试设置用户交互和框架,但没有改变。一旦我在内容上设置了静态高度,它就可以正常工作。保留它。我经历了与您相同的调试过程,所以“AVTouchIgnoringView”是我来到这里的原因,它让我找到了一个解决方案。谢谢!:-)我知道将我的播放器viewcontroller添加到imageview lol是个坏主意,这是我应得的。好问题!