AVPlayer UITapGestureRecognizer无法正常工作

Gin*_*Dev 8 iphone objective-c ios uitapgesturerecognizer avplayerviewcontroller

我有这个代码AVPlayerViewController.

UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAvPlayer)];
[self.avPlayerViewController.view addGestureRecognizer:tap];
Run Code Online (Sandbox Code Playgroud)

但这不起作用..:S,我尝试过设置

[self.avPlayerViewController.view setUserInteractionEnabled:YES];
Run Code Online (Sandbox Code Playgroud)

仍然没有好......

唯一可行的解​​决方案是使用UIGestureRecognizer并实现它的shouldReceiveTouch委托并检查av播放器是否被触摸..但问题是,我们不想捕获"轻敲释放"事件..因为如果av player只是触摸了视图,它立即执行代码,这不是我们想要的......

请帮我们解决这个问题..

谢谢!

TyR*_*TyR 8

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

(此刻并不是真的想写一个Swift版本,对不起.:)


Rad*_*adu 5

这应该做到这一点.将识别器添加到播放器的子视图中:

[videoPlayerViewController.view.subviews[0] addGestureRecognizer:tap]
Run Code Online (Sandbox Code Playgroud)

这是一个快速修复复杂的用户界面和手势,看看contentOverlayView看到TyR的答案

  • 在iOS 11上,这会导致应用程序崩溃. (5认同)
  • 任何人都可以确认它是否仍然在最终的v11上崩溃? (2认同)
  • 使用未记录的SPI.首选方法是使用contentOverlayView(请参阅我的回答). (2认同)

小智 -1

或者您可以子类化 AVPlayerViewController 并使用以下方法来

获得控制权:-

1.触摸开始 2.触摸结束

确保设置此标志 self.avPlayerContr.showsPlaybackControls = false

希望这对你有用。