检测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 上的节目

如何通过 Apple TV Siri Remote 检测颠簸

sh Apple TV的MKV和AVI到MP4转换

Apple tv 音频停止

Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听