检测Apple TV home键点击并转换为UIpress类型以获取AVPlayer的当前时间
Posted
技术标签:
【中文标题】检测Apple TV home键点击并转换为UIpress类型以获取AVPlayer的当前时间【英文标题】:Detect Apple TV home button tap and convert into UIPress type to get AVPlayer's current time 【发布时间】:2017-03-08 17:47:53 【问题描述】:简而言之,我正在寻找来自https://developer.apple.com/library/content/documentation/General/Conceptual/AppleTV_PG/DetectingButtonPressesandGestures.html 的窃听方法的实现
详细说明:
我正在使用 Objective-C 开发 tvOS 应用程序。当我使用 AVPlayer 播放视频时,我想在用户按下主页按钮时记录播放器的当前时间。
// Play the stream
player = [[AVPlayer alloc] initWithURL: [NSURL URLWithString: url]];
AVPlayerViewController *pvc = [[AVPlayerViewController alloc] init];
pvc.player = player;
self.player = player;
self.playerViewController = pvc;
UITapGestureRecognizer *tapGestureRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
tapGestureRec.allowedPressTypes = @[@(UIPressTypeMenu), @(UIPressTypeSelect)];
[self.playerViewController.view addGestureRecognizer:tapGestureRec];
在这里,我在下面的方法中捕获了点击,但不知道如何从遥控器检查它的主页按钮点击。
-(void) 已点击:(UIGestureRecognizer *)sender
//实现?
我尝试了以下实现,但它崩溃了:
-(void) 已点击:(UIGestureRecognizer *)sender
UIPress *press = (UIPress *)sender;
if(press.type == UIPressTypeMenu)
// Do what you want
// ...
cmTime = CMTimeMakeWithSeconds(CMTimeGetSeconds(self.player.currentTime), self.player.currentTime.timescale);
else
NSLog(@"%ld", (long)press.type);
错误: 2017-03-08 09:45:35.991 XXXXX[63556:3612942]-[UITapGestureRecognizer 类型]:无法识别的选择器发送到实例 0x6080001bddc0 2017-03-08 09:45:35.997 XXXXX[63556:3612942] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UITapGestureRecognizer 类型]:无法识别的选择器发送到实例 0x6080001bddc0”
我是第一次使用 Apple tv 遥控器,所以我需要你的帮助。其他帖子帮不了我。
【问题讨论】:
【参考方案1】:“主页按钮”是带有电视标签的按钮,由 tvOS 处理,无法用于自定义手势。
它甚至不是 UIPressType 定义的一部分。
public enum UIPressType : Int
case UpArrow
case DownArrow
case LeftArrow
case RightArrow
case Select
case Menu
case PlayPause
另一方面,您的代码实际上是为菜单和选择按钮创建手势。
崩溃是因为这段代码:
UIPress *press = (UIPress *)sender;
if(press.type == UIPressTypeMenu)
将UIGestureRecognizer
的实例转换为UIPress
,这是完全不同的事情。尝试调用 UIPress 的方法时会崩溃,因为它实际上是一个不同的类。
如果您想为每个手势识别器执行不同的操作,您应该考虑使用 2 个不同的手势识别器,而不是尝试检测触发该操作的实际按下。
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
UITapGestureRecognizer *menuGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(menuKeyWasPressed)];
menuGestureRecognizer.allowedPressTypes = @[@(UIPressTypeMenu)];
[self.view addGestureRecognizer:menuGestureRecognizer];
UITapGestureRecognizer *selectGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectKeyWasPressed)];
selectGestureRecognizer.allowedPressTypes = @[@(UIPressTypeSelect)];
[self.view addGestureRecognizer:selectGestureRecognizer];
-(void)menuKeyWasPressed
NSLog(@"Menu key was pressed");
-(void)selectKeyWasPressed
NSLog(@"Select key was pressed");
@end
【讨论】:
它有帮助。谢谢。我一定会试试这个。以上是关于检测Apple TV home键点击并转换为UIpress类型以获取AVPlayer的当前时间的主要内容,如果未能解决你的问题,请参考以下文章
如何检测是不是从 Apple TV Siri Remote 中单击了 Siri 按钮
iOS - Apple TV - 以编程方式检测 Apple TV 上的节目