在虚拟键盘上检测按键

问题描述:

我正在为我的儿子开发一个小型儿童游戏,涉及虚拟键盘上的计时。在虚拟键盘上检测按键

是否可以检测虚拟键盘上的按键何时被按下?即获得触摸通知(touchesBegan)?我不需要知道哪个按键被按下,只要按下按键动作开始。

无法直接从虚拟键盘获取触摸事件。但是,您可以使用屏幕外的UITextField,以便它不可见并请拨打becomeFirstResponder来显示键盘。然后,如Khomsan建议的那样,您可以实现委托方法textView:shouldChangeTextInRange:,以便在按下某个键时得到通知。

更清晰的可能性是编写实现UIKeyInput协议的自定义UIControl。你只需要提供insertText:,deleteBackwardhasText的实现(对于这个,你可以简单地总是返回YES)。为了使键盘可见,您需要再次拨打becomeFirstResponder作为您的自定义控件。

这两种方法的共同之处在于,只有在密钥为时才会通知(以便输入文本),而不是在触摸实际开始时才会通知您。正如我所说,直接获取tochesBegan事件是不可能的。如果你需要的话,你可能不得不实现你自己的屏幕键盘。

+0

谢谢。这证实了我怀疑这是不可能的(没有自定义键盘)。我已经有一个关键释放案例的解决方案(textView:shouldChangeTextInRange :)。 是否可以在键盘上放置透明视图,还是浪费时间来尝试? – peterparnes

+0

我想这是可能的,但是你需要为此创建另一个'UIWindow',因为键盘有它自己的窗口,所以你平常的视图层次结构中的任何视图都会在它下面。 – omz

+0

谢谢!欣赏答案! – peterparnes

是的,你可以只使用:

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

我还需要添加什么来从UITextView获取这些事件? – peterparnes

+0

这只会在您自己的视图中检测到触摸,而不是虚拟键盘。 – omz

+0

放下你要放的地方。 – Cyprian

对于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。