如何检测 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
}
}
根据 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
}
}