iOS 11中AVPlayerViewController的UITapGestureRecognizer无法工作求助
解决AVPlayerViewController添加UITapGestureRecognizer无效的问题
嘿,我之前也踩过这个坑!AVPlayerViewController本身自带了一套手势识别逻辑,直接把自定义手势加到player.view上的话,会被它内部的视图拦截,所以你的手势根本触发不了。给你两个靠谱的解决方案:
方案一:使用官方推荐的contentOverlayView(优先选这个)
AVPlayerViewController专门提供了contentOverlayView这个容器视图,它位于播放层的上方,就是用来让开发者添加自定义控件和手势的,完全不会和系统自带的手势冲突。代码示例:
// 创建点击手势 let wakeOverlayTap = UITapGestureRecognizer(target: self, action: #selector(wake_YCOverlayView)) // 将手势添加到contentOverlayView self.playerViewController.contentOverlayView?.addGestureRecognizer(wakeOverlayTap) // 对应的响应方法 @objc func wake_YCOverlayView() { // 这里写你要执行的逻辑,比如唤醒你的overlay视图 print("唤醒Overlay视图成功!") }
方案二:禁用系统默认手势(不推荐,影响原生交互)
如果你必须要把手势加到player.view上,可以尝试禁用AVPlayerViewController自带的手势识别器,但这样会导致原生的播放暂停、进度拖动等手势失效,所以除非特殊需求,不建议这么做。代码示例:
// 遍历playerViewController的子视图,禁用所有系统手势 func disableSystemGestures() { guard let playerView = self.playerViewController.view else { return } for subview in playerView.subviews { subview.gestureRecognizers?.forEach { $0.isEnabled = false } // 递归处理子视图的子视图,确保所有系统手势都被禁用 disableSystemGestures(for: subview) } } func disableSystemGestures(for view: UIView) { for subview in view.subviews { subview.gestureRecognizers?.forEach { $0.isEnabled = false } disableSystemGestures(for: subview) } } // 调用禁用方法后,再添加你的自定义手势 disableSystemGestures() self.playerViewController.player?.view.addGestureRecognizer(wakeOverlayTap)
为什么你之前的方法无效?因为AVPlayerViewController的player.view内部嵌套了系统的手势识别器(比如点击播放/暂停的手势),这些手势的响应优先级比你添加的自定义手势高,所以你的手势永远得不到触发的机会。而contentOverlayView是独立于播放层的上层容器,完全不会被系统手势拦截,这也是苹果官方推荐的自定义交互方式哦。
内容的提问来源于stack exchange,提问作者Rong Gong
相关产品推荐
相关产品推荐

