是否可以连续按键?
我正在使用 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];
}
答案 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”。正如我所提到的,有一个限制。如果按住向上箭头然后按另一个键,代码将假定已经释放了向上箭头键。
当您按住向上箭头键时会发生这种情况:
释放密钥时会发生这种情况:
正如我上面提到的,这种方法存在局限性;如果您在按下另一个按钮的同时按下箭头并按住它,此代码将认为您已释放向上箭头按钮。您显然需要使用计时器将其打包,以便在您的应用程序中连续按键。
答案 3 :(得分:0)
现在可以使用iOS 13.4+了。 UIPress现在有了UIKey成员变量