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 中禁用手势识别器