这似乎应该很简单,但是我很难找到一个有效的示例,良好的文档甚至是很多有用的StackOverflow帖子。
我有一个包含AVPlayer的自定义视图,如下所示:
@implementation
{
@private
AVPlayerViewController *controller
}
- (id) init
{
self = [super init];
if (self)
{
controller = [[AVPlayerViewController alloc] init];
controller.view.frame = self.view.bounds;
[self.view addSubview:controller.view];
}
return self;
}
@end
((我还有其他一些视图,例如覆盖播放器的消息,在交换视频时显示的海报等,但这是基本设置)
当我集成IMA SDK时,我开始遇到问题。如果您在广告期间按遥控器上的“暂停”按钮,则可以暂停广告。但是,如果您按下暂停按钮再次,则它不会取消暂停广告,而是会取消暂停我的内容播放器在广告后面的作用。我没有听到任何音频,但是我知道内容播放器没有暂停,因为我的视频中有ID3元数据,当我点击它时,它有一个NSLog()
语句,并且我开始看到这些日志。如果再次按下暂停按钮,日志将暂停。我第四次按下它,日志再次启动。
为了解决此问题,我想将听众绑定到遥控器的播放/暂停按钮,并确保如果我正在播放广告,则恢复[[ad,而不是内容。因此,我尝试在我的视图的init
方法中添加以下内容:
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapped:)];
[tapRecognizer setAllowedPressTypes:@[ [NSNumber numberWithInt:UIPressTypePlayPause] ]];
[self.view addGestureRecognizer:tapRecognizer];
然后我创建了以下方法:
- (void) tapped: (UITapGestureRecognizer *) sender { NSLog(@"Tapped"); }
没有被调用。我很确定自己犯了一个简单的错误,但是文档不是很清楚,所以我不确定应该怎么做。 official documentation on detecting button presses使用Swift并说:
let tapRecognizer = UITapGestureRecognizer(target: self, action: "tapped:") tapRecognizer.allowedPressTypes = [NSNumber(integer: UIPressType.PlayPause.rawValue)]; self.view.addGestureRecognizer(tapRecognizer)
我我把这三行翻译得很好。然后,文档未显示相信
tapped
方法的外观,而是继续处理低级事件处理。因此,为了获得适当的方法签名,我查看了the documentation on UITagGestureRecognizer,该示例具有以下用于编写处理程序的(Swift)示例:func handleTap(sender: UITapGestureRecognizer) {
if sender.state == .ended {
// handling code
}
}
这就是为什么我选择- (void) tapped: (UITapGestureRecognizer *) sender
仍然,毕竟,这是行不通的。
快速更新
我尝试替换:
initWithTarget:self.view
使用:
initWithTarget:controller.view
和:
self.view addGestureRecognizer
使用:
controller.view addGestureRecognizer
这次,当我按下播放/暂停按钮时,似乎确实发生了某些事情。应用程序崩溃了,Xcode给了我以下错误:
2019-12-17 12:16:50.937007-0500 Example tvOS App[381:48776] -[_AVPlayerViewControllerContainerView tapped:]: unrecognized selector sent to instance 0x10194e060
所以它(如果我错了,请纠正我):似乎像
my
unrecognized selector
崩溃,您需要确保为手势识别器提供正确的对象作为target
。 UIGestureRecognizer
的工作方式是,识别手势后,它将在给定selector
对象上调用给定target
。换句话说,当手势触发时,它将执行以下操作: