AVPlayer UITapGestureRecognizer 不工作
AVPlayer UITapGestureRecognizer not working
我有 AVPlayerViewController
的代码。
UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAvPlayer)];
[self.avPlayerViewController.view addGestureRecognizer:tap];
但这不起作用..:S,我尝试设置
[self.avPlayerViewController.view setUserInteractionEnabled:YES];
还是不行..
唯一可行的解决方案是使用 UIGestureRecognizer
并实现它的 shouldReceiveTouch
委托并检查是否触摸了 av 播放器..但问题是,我们不想捕获 "tap release" 事件.. 因为如果 av player
视图被触摸,它会立即执行代码,这不是我们想要的...
请帮助我们解决这个问题..
谢谢!
据我所知,你真正想要的是
UILongPressGestureRecognizer
因为,
UITapGestureRecognizer
没有任何发布类型的事件,如果你添加
UILongPressGestureRecognizer
给你的
avPlayerViewController
然后在
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ( [gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] ) {
}
return YES;
}
然后你可以设置手势的最小持续时间以获得更好的手感,
[holdGesture setMinimumPressDuration:0.01]
然后就可以实现方法了,
- (void)holdAction:(UILongPressGestureRecognizer *)holdRecognizer
然后检查识别器的状态并执行所需的功能
您可以在 avplayerViewController
上添加 transparent
视图,也可以在该视图上添加 tapgesturerecognizer
。希望这会有所帮助:)
或者您可以将 AVPlayerViewController 子类化并使用 followwing 方法
取得控制权:-
1.touchBegan
2.touchEnd
确保设置此标志 self.avPlayerContr.showsPlaybackControls = false
希望这对你有用。
这应该可以做到。改为将识别器添加到播放器的子视图中:
[videoPlayerViewController.view.subviews[0] addGestureRecognizer:tap]
这是对复杂 UI 和手势调查的快速修复
contentOverlayView 见 TyR 回答
简单的解决方案是在添加电影播放器后在同一个电影持有者视图上添加一个手势视图。
无需直接将手势识别器添加到电影播放器。
[self.movieHolderView addSubview:self.moviePlayer.view];
[self.movieHolderView addSubview:self.gestureView];
[self.movieHolderView bringSubviewToFront:self.gestureView];
现在我们可以像这样在手势视图上添加手势识别器
self.fullScreenTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandler:)];
self.fullScreenTapGesture.numberOfTapsRequired = 1;
[self.gestureView addGestureRecognizer:self.fullScreenTapGesture];
AVPlayerViewController 上手势处理的正确位置是在控制器的 contentOverlayView 内。
contentOverlayView 是一个只读 属性 的 AVPlayerViewController。这是一个显示在视频上方但在控制器下方的视图。触摸处理的完美场所。您可以在加载时向其添加子视图或手势处理程序。
以下代码以两种方式为您的视频控制器提供触摸支持,以演示手势识别和 UIButton 方法。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"mySegue"])
{
// Set things up when we're about to go the the video
AVPlayerViewController *avpvc = segue.destinationViewController;
AVPlayer *p = nil;
p = [AVPlayer playerWithURL:[NSURL URLWithString:@"https://my-video"]];
avpvc.player = p;
// Method 1: Add a gesture recognizer to the view
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myAction:)];
avpvc.contentOverlayView.gestureRecognizers = @[tap];
// Method 2: Add a button to the view
UIButton *cov = [UIButton buttonWithType:UIButtonTypeCustom];
[cov addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside];
cov.frame = self.view.bounds;
}
}
(目前还没有准备好编写 Swift 版本,抱歉。:)
应该为 OS 11 和更早版本 OS 添加不同的手势识别器:
通用解决方案(Swift 4):
let tap = UITapGestureRecognizer(target: self, action: #selector(videoTap))
if #available(iOS 11.0, *) {
playerVC?.contentOverlayView?.gestureRecognizers = [tap]
} else {
playerVC?.view.subviews.first?.addGestureRecognizer(tap)
}
@objc func videoTap(_ button: UIButton) {
print("Tapped on video")
}
Swift 4
向 AVPlayerViewController 的视图添加手势识别器:
func playVideo() {
let playerController = AVPlayerViewController()
playerController.player = AVPlayer(url: URL(fileURLWithPath: videoPath))
playerController.showsPlaybackControls = false
playerController.view.isUserInteractionEnabled = true
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
swipeUp.direction = UISwipeGestureRecognizerDirection.up
playerController.view.addGestureRecognizer(swipeUp)
present(playerController, animated: false) {
playerController.player?.play()
}
}
@objc func respondToSwipeGesture(gesture: UIGestureRecognizer) {
print("swipe up")
}
我有 AVPlayerViewController
的代码。
UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAvPlayer)];
[self.avPlayerViewController.view addGestureRecognizer:tap];
但这不起作用..:S,我尝试设置
[self.avPlayerViewController.view setUserInteractionEnabled:YES];
还是不行..
唯一可行的解决方案是使用 UIGestureRecognizer
并实现它的 shouldReceiveTouch
委托并检查是否触摸了 av 播放器..但问题是,我们不想捕获 "tap release" 事件.. 因为如果 av player
视图被触摸,它会立即执行代码,这不是我们想要的...
请帮助我们解决这个问题..
谢谢!
据我所知,你真正想要的是
UILongPressGestureRecognizer
因为,
UITapGestureRecognizer
没有任何发布类型的事件,如果你添加
UILongPressGestureRecognizer
给你的
avPlayerViewController
然后在
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ( [gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] ) {
}
return YES;
}
然后你可以设置手势的最小持续时间以获得更好的手感,
[holdGesture setMinimumPressDuration:0.01]
然后就可以实现方法了,
- (void)holdAction:(UILongPressGestureRecognizer *)holdRecognizer
然后检查识别器的状态并执行所需的功能
您可以在 avplayerViewController
上添加 transparent
视图,也可以在该视图上添加 tapgesturerecognizer
。希望这会有所帮助:)
或者您可以将 AVPlayerViewController 子类化并使用 followwing 方法
取得控制权:-
1.touchBegan 2.touchEnd
确保设置此标志 self.avPlayerContr.showsPlaybackControls = false
希望这对你有用。
这应该可以做到。改为将识别器添加到播放器的子视图中:
[videoPlayerViewController.view.subviews[0] addGestureRecognizer:tap]
这是对复杂 UI 和手势调查的快速修复 contentOverlayView 见 TyR 回答
简单的解决方案是在添加电影播放器后在同一个电影持有者视图上添加一个手势视图。 无需直接将手势识别器添加到电影播放器。
[self.movieHolderView addSubview:self.moviePlayer.view];
[self.movieHolderView addSubview:self.gestureView];
[self.movieHolderView bringSubviewToFront:self.gestureView];
现在我们可以像这样在手势视图上添加手势识别器
self.fullScreenTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandler:)];
self.fullScreenTapGesture.numberOfTapsRequired = 1;
[self.gestureView addGestureRecognizer:self.fullScreenTapGesture];
AVPlayerViewController 上手势处理的正确位置是在控制器的 contentOverlayView 内。
contentOverlayView 是一个只读 属性 的 AVPlayerViewController。这是一个显示在视频上方但在控制器下方的视图。触摸处理的完美场所。您可以在加载时向其添加子视图或手势处理程序。
以下代码以两种方式为您的视频控制器提供触摸支持,以演示手势识别和 UIButton 方法。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"mySegue"])
{
// Set things up when we're about to go the the video
AVPlayerViewController *avpvc = segue.destinationViewController;
AVPlayer *p = nil;
p = [AVPlayer playerWithURL:[NSURL URLWithString:@"https://my-video"]];
avpvc.player = p;
// Method 1: Add a gesture recognizer to the view
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myAction:)];
avpvc.contentOverlayView.gestureRecognizers = @[tap];
// Method 2: Add a button to the view
UIButton *cov = [UIButton buttonWithType:UIButtonTypeCustom];
[cov addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside];
cov.frame = self.view.bounds;
}
}
(目前还没有准备好编写 Swift 版本,抱歉。:)
应该为 OS 11 和更早版本 OS 添加不同的手势识别器:
通用解决方案(Swift 4):
let tap = UITapGestureRecognizer(target: self, action: #selector(videoTap))
if #available(iOS 11.0, *) {
playerVC?.contentOverlayView?.gestureRecognizers = [tap]
} else {
playerVC?.view.subviews.first?.addGestureRecognizer(tap)
}
@objc func videoTap(_ button: UIButton) {
print("Tapped on video")
}
Swift 4
向 AVPlayerViewController 的视图添加手势识别器:
func playVideo() {
let playerController = AVPlayerViewController()
playerController.player = AVPlayer(url: URL(fileURLWithPath: videoPath))
playerController.showsPlaybackControls = false
playerController.view.isUserInteractionEnabled = true
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
swipeUp.direction = UISwipeGestureRecognizerDirection.up
playerController.view.addGestureRecognizer(swipeUp)
present(playerController, animated: false) {
playerController.player?.play()
}
}
@objc func respondToSwipeGesture(gesture: UIGestureRecognizer) {
print("swipe up")
}