AVPlayerViewController UITapGestureRecognizer 在 ios 11 中不起作用

Posted

技术标签:

【中文标题】AVPlayerViewController UITapGestureRecognizer 在 ios 11 中不起作用【英文标题】:AVPlayerViewController UITapGestureRecognizer not working in ios 11 【发布时间】:2018-04-14 20:18:17 【问题描述】:

我知道这可能是这个问题AVPlayer UITapGestureRecognizer not working的复制品

但是,我仍然发布它,因为我没有足够的代表来评论原始答案。

问题是如何将UITapGestureRecognizer 添加到AVPlayerViewController。我尝试过的事情:

let wake_overlayview = UITapGestureRecognizer(target: self, action:#selector(self.wake_YCOverlayView))

(1) 将手势识别器添加到控制器的视图中。这不起作用:

self.player.view.addGestureRecognizer(wake_overlayview)

(2)将其添加到contentOverlayView:

self.player.contentOverlayView?.addGestureRecognizer(wake_overlayview)

这个解决方案似乎在这个答案https://***.com/a/48797984/4342489 中有效。但是,它对我不起作用...

(3) 初始化一个UIView,在其上添加gestureRecognizer,然后将此视图添加到AVPlayer.view子视图中。这不起作用:

self.gesture_view.frame = CGRect(x: 0,
                                 y: 0,
                                 width: self.player.view.frame.size.width,
                                 height: self.player.view.frame.size.height)

self.player.view.addSubview(self.gesture_view) 
self.player.view.bringSubview(toFront: self.gesture_view)  
self.gesture_view.addGestureRecognizer(wake_overlayview)  
self.gesture_view.isUserInteractionEnabled = true

(4) 将识别器添加到 player.view 的第一个子视图中。这适用于 ios 10 但不适用于 11,因为在 11 中,player.view 没有任何子视图...

self.player.view.subviews[0].addGestureRecognizer(wake_overlayview)

【问题讨论】:

【参考方案1】:

查看您的代码,您看起来像是 AVPlayerViewController 的子类。不建议这样做。来自Apple documentation:

重要

不要继承 AVPlayerViewController。不支持覆盖此类的方法,并导致未定义的行为。

但是,如果你仍然想继承 AVPlayerViewController,你可以通过覆盖 touchesBegan 来获得触摸:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    print("touchesBegan")

【讨论】:

谢谢,一个后续问题。如何让 touchesBegan 调用选择器函数?像UITapGestureRecognizer(target: self, action:#selector(self.wake_YCOverlayView)) 这样的东西可以调用self.wake_YCOverlayview 函数。 touchesBegan 也可以这样做吗? 是的,你可以像往常一样调用 touchesBegan 中的其他函数:self.wake_YCOverlayview()。如果需要wake_YCOverlayview函数中的触摸信息,只需将UITouch集作为参数传递即可。您可能想查看 UIResponder 的文档(包括 touchesBegan):developer.apple.com/documentation/uikit/uiresponder 这样,我认为函数wake_YCOverlayview应该和touchesBegan在同一个类中定义。我的问题是我可以在启动 AVPlayerViewController 的类中定义 wake_YCOverlayview 吗?我可以通过通知解决这个问题。但是,我认为这不是最佳解决方案... 您可以通过委托解决这个问题,但我认为您最好使用 AVPlayer 制作自己的视图控制器。然后您需要自己处理所有播放器控件,但如果您已经添加了叠加层,这可能是您想要的? 是的,我有一个简单的覆盖,如果我们在几分钟内不触摸屏幕,它会自动从 avplayerviewcontroller.view 中删除。我的目标是使用触摸手势将此叠加层重新添加到 avplayer 视图中。我现在正在做的是从覆盖 touchsBegin 函数发送通知。我不需要处理原始的播放器控件,例如播放、前进、后退按钮。我让它们保持原样。你提到了代表团。你能提供更多关于它的线索,一个链接吗?我不熟悉它。谢谢!

以上是关于AVPlayerViewController UITapGestureRecognizer 在 ios 11 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

检测 AVPlayerViewController 完成按钮点击?

AVPlayerViewController 不按 url 播放视频

iOS - 在 AVPlayerViewController 之上添加控件

在 AVPlayerViewController 中禁用手势识别器

在 AVPlayerViewController 中点击播放按钮时执行操作

Swift AVPlayerViewController 添加 AirPlay