使用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]; } 

看来这在iOS 7中确实不可行。

专业提示 – 我的箭头键被阻止,因为我从虚假的返回

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

确保检查您自己创build的select器。

由于方法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 

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

这是按住向上箭头键时发生的情况:

  1. 首先,方法keyCommands将被调用两次(为什么两次?)
  2. upArrow方法将被调用一次,variableskeyDown将被设置为YES,并且文本“Key pressed”将被打印。

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

  1. keyCommands方法将被调用一次。 自keyDown = YES以来,将会打印“发布密钥”文本。

正如我上面提到的,这个方法有一个局限性。 如果您先按住箭头并按住另一个button,则此代码将认为您已释放向上箭头button。 你显然需要用计时器来包装它,以便在应用程序中持续按下按键。

    Interesting Posts