Détection des pressions de touches continues avec UIKeyCommand

Est-il possible d'get des presses à touches continues?

J'utilise keyCommands : pour intercepter les touches de flèches appuyées sur un keyboard externe, mais je reçois seulement 1 appel par presse. J'aimerais recevoir plusieurs appels toutes les X millisecondes tant que la touche est maintenue enfoncée, ou des appels lorsque la touche est pressée et quand elle est relâchée.

Voici mon 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]; } 

Il semble que ce n'est en effet pas possible dans iOS 7.

Astuce Pro – mes touches fléchées ont été bloquées parce que j'avais returnné faux de

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

Assurez-vous de vérifier vos propres sélecteurs que vous avez créés.

Il est possible d'get des pressions de touches continues car la méthode keyCommands est d'abord appelée lorsque vous appuyez sur une touche du keyboard, puis callbackée après la libération de la touche. Cependant, vous ne pouvez pas dire si l'user relâche une touche ou appuie sur une autre touche tout en maintenant la première touche enfoncée, il y a donc des limites à ce que vous pouvez faire.

Cette limitation devrait être correcte tant que votre application ne nécessite pas que l'user puisse appuyer et maintenir plusieurs touches en même time. Si vous pouvez supposer que l'user n'appuie que sur une touche à la fois, vous pouvez l'utiliser pour get des pressions continues sur les touches.

EDIT: J'ai eu le commentaire que cela semble être une fausse déclaration. C'est faux! Voici un exemple complet:

 #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 

Lorsque vous appuyez sur le button fléché vers le haut, vous verrez le text "Touche enfoncée" dans la console de sortie. Lorsque vous le relâchez, vous verrez le text "Key released". Comme je l'ai mentionné, il y a une limite. Si vous maintenez la flèche haut enfoncée et appuyez simultanément sur une autre touche, le code supposera que la flèche vers le haut a été relâchée.

C'est ce qui se passe lorsque vous appuyez et maintenez la touche fléchée vers le haut:

  1. Tout d'abord, la méthode keyCommands sera appelée deux fois (pourquoi deux fois?)
  2. La méthode upArrow sera appelée une fois et la variable keyDown sera définie sur YES et le text "Key press" sera imprimé.

C'est ce qui se passe lorsque vous relâchez la touche:

  1. La méthode keyCommands sera appelée une fois. Le text "Key released" sera imprimé depuis keyDown = YES.

Comme je l'ai mentionné ci-dessus, il y a une limitation avec cette méthode; Si vous appuyez d'abord sur la flèche vers le haut et la maintenez enfoncée tout en appuyant sur un autre button, ce code croira que vous avez relâché le button fléché vers le haut. Vous avez évidemment besoin d'envelopper avec une timer pour get des pressions de touches continues dans votre application.