2014-01-09 45 views
14

是否可以連續按鍵?使用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]; 
} 

回答

5

看來,這確實是不可能的iOS 7

+1

查看Lars Forsberg的答案。 – Ron

+1

@這個「解決方案」依賴於無證的行爲,並可能在任何時候中斷。使用這種方法非常令人沮喪。 –

2

這是可能的,因爲該方法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」。

這是當你鬆開按鍵時會發生什麼:

  • 方法keyCommands將被調用一次。自keyDown = YES以來,「Key released」文字將被打印出來。
  • 正如我上面提到的那樣,這個方法有一個限制;如果您先按住箭頭並按住另一個按鈕,則此代碼會認爲您已釋放向上箭頭按鈕。你顯然需要用定時器來包裝它,以在你的應用中持續按下按鍵。

    +0

    這是iOS 8的新功能嗎?當我測試這個時,情況並非如此。 –

    +0

    這不是錯誤的,我有這個工作在我自己的應用VividTracker。你什麼意思是錯誤的? –

    +0

    我現在已經添加了一個完整的例子,顯示這個工程。你可以在模擬器中運行它。它也適用於部署到iOS 7.1時。 –

    3

    臨提示 - 我的箭頭鍵被封鎖,因爲我已經從

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

    返回false確保檢查你已經創建了自己的選擇。