使用UIKeyCommand检测连续按键

时间:2014-01-09 12:51:26

标签: ios keyboard keyboard-shortcuts uiresponder uikeycommand

是否可以连续按键?

我正在使用 keyCommands :拦截在外接键盘上按下的箭头键,但每次按下我只能接听1次。我希望只要按下按键就可以每X毫秒进行一次多次通话,或者按下该按键并在按下按键时进行调用。

这是我的代码:

- (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 个答案:

答案 0 :(得分:5)

似乎在iOS 7中确实无法实现这一点。

答案 1 :(得分:4)

专业提示 - 我的箭头键已被屏蔽,因为我从

返回了false
-(BOOL) canPerformAction:(SEL)action withSender:(id)sender 

请务必检查您自己创建的选择器。

答案 2 :(得分:3)

可以连续按键,因为当您按下键盘上的键时首先调用 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

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

当您按住向上箭头键时会发生这种情况:

  1. 首先,方法keyCommands将被调用两次(为什么两次?)
  2. upArrow方法将被调用一次,变量keyDown将被设置为YES,并且将打印文本“Key pressed”。
  3. 释放密钥时会发生这种情况:

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

      正如我上面提到的,这种方法存在局限性;如果您在按下另一个按钮的同时按下箭头并按住它,此代码将认为您已释放向上箭头按钮。您显然需要使用计时器将其打包,以便在您的应用程序中连续按键。

答案 3 :(得分:0)

现在可以使用iOS 13.4+了。 UIPress现在有了UIKey成员变量

请参阅此official tutorial