2011-07-30 244 views
0

我正在爲我的兒子開發一個小型兒童遊戲,涉及虛擬鍵盤上的計時。在虛擬鍵盤上檢測按鍵

是否可以檢測虛擬鍵盤上的按鍵何時被按下?即獲得觸摸通知(touchesBegan)?我不需要知道哪個按鍵被按下,只要按下按鍵動作開始。

回答

0

無法直接從虛擬鍵盤獲取觸摸事件。但是,您可以使用屏幕外的UITextField,以便它不可見並請撥打becomeFirstResponder來顯示鍵盤。然後,如Khomsan建議的那樣,您可以實現委託方法textView:shouldChangeTextInRange:,以便在按下某個鍵時得到通知。

更清晰的可能性是編寫實現UIKeyInput協議的自定義UIControl。你只需要提供insertText:,deleteBackwardhasText的實現(對於這個,你可以簡單地總是返回YES)。爲了使鍵盤可見,您需要再次撥打becomeFirstResponder作爲您的自定義控件。

這兩種方法的共同之處在於,只有在密鑰爲時纔會通知(以便輸入文本),而不是在觸摸實際開始時纔會通知您。正如我所說,直接獲取tochesBegan事件是不可能的。如果你需要的話,你可能不得不實現你自己的屏幕鍵盤。

+0

謝謝。這證實了我懷疑這是不可能的(沒有自定義鍵盤)。我已經有一個關鍵釋放案例的解決方案(textView:shouldChangeTextInRange :)。 是否可以在鍵盤上放置透明視圖,還是浪費時間來嘗試? – peterparnes

+0

我想這是可能的,但是你需要爲此創建另一個'UIWindow',因爲鍵盤有它自己的窗口,所以你平常的視圖層次結構中的任何視圖都會在它下面。 – omz

+0

謝謝!欣賞答案! – peterparnes

-3

是的,你可以只使用:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    //do what you need 
    [super touchesBegan:touches withEvent:event]; 
} 
+0

我還需要添加什麼來從UITextView獲取這些事件? – peterparnes

+0

這隻會在您自己的視圖中檢測到觸摸,而不是虛擬鍵盤。 – omz

+0

放下你要放的地方。 – Cyprian

1

對於TextView中可以使用...

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
- (void)textViewDidChange:(UITextView *)textView 

對於文本字段可以使用...

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

見UITextViewDelegate和Apple網站上的UITextFieldDelegate。