如何检测 Apple TV Siri 远程按钮按下?

How to detect Apple TV Siri Remote button presses?

根据 Apple TV 界面 guideline,当涉及到游戏时,当您不在游戏的主菜单中时,您应该将菜单按钮用作暂停按钮(其中如果它应该 return 到 Apple TV OS 菜单)。但是,我在任何地方都找不到您应该如何检测遥控器的硬按钮输入(与屏幕上的软按钮相反)。

我确实找到了this使用控制器的简短编程指南,几乎似乎暗示在这种情况下您应该将遥控器用作控制器,但我忍不住想到有一种更简单的方法。例如

 -(void)buttonPressBegan:(NSEvent*)event

等(这不是真的……我只是希望有类似的东西)。 is/Is 有什么检测方法?

你很接近!这些是您想要的方法:它们的工作原理基本上与触摸等效方法一样。

- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIEvent *)event;
- (void)pressesChanged:(NSSet<UIPress *> *)presses withEvent:(UIEvent *)event;
- (void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIEvent *)event;
- (void)pressesCancelled:(NSSet<UIPress *> *)presses withEvent:(UIEvent *)event;

Apple suggests 使用 UITapGestureRecognizer 检测按钮何时被释放。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController {
    UITapGestureRecognizer *tapRecognizer;
}

-(void)viewDidLoad {
    [super viewDidLoad];

    tapRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap:)];
    tapRecognizer.allowedPressTypes = @[[NSNumber numberWithInteger:UIPressTypeMenu]];
    [self.view addGestureRecognizer:tapRecognizer];
}

-(void)handleTap:(UITapGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Menu button released");
    }
}

有关 UIPressType 的完整列表,请参阅 UIPress Class Reference

如果您使用类似 UISplitViewController 的东西,事件检测将发生在 "DetailViewController" 上。但是视图控制器仍然会被解雇!这是为了检测 MENU 按钮是否被按下,而不是覆盖它的行为。

 override func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) {
    guard let type = presses.first?.type else {
        return
    }

    switch type {
    case UIPressType.Menu :
        //Handle this here
    default : break

    }
}
In Swift 3
override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {

    guard let type = presses.first?.type else {
        return
    }

    switch type {
    case UIPressType.menu : break
    //Handle this here
    default : break

    }
}