15

Is it possible to get continuous key presses?

I'm using keyCommands: to intercept the arrows keys being pressed on an external keyboard, but I only get 1 call per press. I would love to get either multiple calls every X milliseconds as long as the key is held down, or calls when the key is pressed and when it’s released.

Here's my code:

- (NSArray *)keyCommands
{
    UIKeyCommand *upArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputUpArrow
                                                modifierFlags:0
                                                       action:@selector(upArrow:)];
    UIKeyCommand *downArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputDownArrow
                                                  modifierFlags:0
                                                         action:@selector(downArrow:)];
    UIKeyCommand *leftArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputLeftArrow
                                                  modifierFlags:0
                                                         action:@selector(leftArrow:)];
    UIKeyCommand *rightArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputRightArrow
                                                   modifierFlags:0
                                                          action:@selector(rightArrow:)];
    UIKeyCommand *leftArrowCmd = [UIKeyCommand keyCommandWithInput:UIKeyInputLeftArrow
                                                     modifierFlags:UIKeyModifierCommand
                                                            action:@selector(leftArrowCmd:)];
    UIKeyCommand *rightArrowCmd = [UIKeyCommand keyCommandWithInput:UIKeyInputRightArrow
                                                      modifierFlags:UIKeyModifierCommand
                                                             action:@selector(rightArrowCmd:)];
    UIKeyCommand *lCmd = [UIKeyCommand keyCommandWithInput:@"l"
                                             modifierFlags:UIKeyModifierCommand
                                                    action:@selector(lCmd:)];
    UIKeyCommand *rCmd = [UIKeyCommand keyCommandWithInput:@"r"
                                             modifierFlags:UIKeyModifierCommand
                                                    action:@selector(rCmd:)];
    UIKeyCommand *mCmd = [UIKeyCommand keyCommandWithInput:@"m"
                                             modifierFlags:UIKeyModifierCommand
                                                    action:@selector(mCmd:)];
    return @[upArrow, downArrow, leftArrow, rightArrow, leftArrowCmd, rightArrowCmd, lCmd, rCmd, mCmd];
}
4

4 回答 4

6

似乎这在 iOS 7 中确实是不可能的。

于 2014-01-14T10:44:40.880 回答
4

有可能获得连续的按键,因为当您按下键盘上的一个键时首先调用方法keyCommands ,然后在释放该键后再次调用该方法。但是,您无法判断用户在按住第一个键的同时是释放一个键还是按下另一个键,因此您可以执行的操作受到限制。

只要您的应用程序不要求用户可以同时按住多个键,此限制应该没问题。如果您可以假设用户一次只按一个键,则可以使用它来获得连续的按键。

编辑:我得到评论,这似乎是一个错误的陈述。那是错的!这是一个完整的例子:

#import "ViewController.h"

@interface ViewController ()
{
    bool keyDown;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    keyDown = NO;
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (NSArray*)keyCommands
{
    if(keyDown==YES) {
        printf("Key released\n");
        keyDown = NO;
    }
    UIKeyCommand *upArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputUpArrow
                                                modifierFlags:0
                                                       action:@selector(upArrow:)];
    return @[upArrow];
}

-(void)upArrow:(UIKeyCommand*)keyCommand
{
    printf("Key pressed\n");
    keyDown = YES;
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}
@end

当您按下向上箭头按钮时,您将在输出控制台中看到文本“按下键”。当你释放它时,你会看到文本“密钥释放”。正如我所提到的,有一个限制。如果您按住向上箭头,然后同时按下另一个键,代码将假定向上箭头键已被释放。

当您按住向上箭头键时,会发生以下情况:

  1. 首先,方法 keyCommands 会被调用两次(为什么是两次?)
  2. upArrow 方法将被调用一次,变量 keyDown 将被设置为 YES,并且将打印文本“Keypressed”。

这是释放密钥时发生的情况:

  1. 方法 keyCommands 将被调用一次。由于 keyDown=YES,将打印文本“Key released”。

正如我上面提到的,这种方法有一个限制;如果您先按向上箭头并按住另一个按钮,则此代码将认为您已释放向上箭头按钮。你显然需要用一个计时器来结束它,以便在你的应用程序中获得连续的按键。

于 2015-01-09T09:52:58.323 回答
4

专业提示 - 我的箭头键被阻止,因为我从

-(BOOL) canPerformAction:(SEL)action withSender:(id)sender 

确保检查您自己创建的选择器。

于 2015-10-26T06:55:13.463 回答
0

使用 iOS 13.4+ 现在可以。UIpress现在有一个 UIKey 成员变量

参考这个官方教程

于 2020-08-12T16:45:15.420 回答