iPhone软键盘占据216像素高,这对于iPhone仅仅320*480像素的屏幕来说,不能说不是一个很糟糕的事情。
为了隐藏iPhone的软键盘,程序员们想出了各种招式。最常见的莫过于结合UITextFieldDelegate的textFieldDidBeginEditing方法和[textFieldresignFirstResponder]方法了。
但想象一下下面的场景,这种方法就无能为力了。
当你点击“键盘”时,textView becomeFirstResponder被调用,于是键盘弹出。当你点击“常用意见”时, ,键盘被隐藏。但与此同时,TextView中的文本仍然是可以编辑的(你可以看见光标闪烁)。
如果你使用[textView resignFirstResponder]隐藏键盘,则Text View将无法获得焦点,也许你仍然可以用下面的那些批注按钮在TextView中插入文字,但你不知道插入点是在哪里(没有闪烁的光标你可能不知道自己正在编辑的文本位置),你也不可能选中一段文字,然后用一个“已阅”来替换它。总而言之,resignFirstResponder之后,TextView的编辑功能非常之不好用。
让我们来换一种思路,也许我们不需要让键盘不弹出,而是把它“隐藏”起来,不要挡住我们下面的那一排编辑按钮。我们知道iPhone的许多控件仍然继承自UIView,如果键盘也是这样,那么我们找出键盘所在的UIView并把它的hidden设置为YES?在textViewDidBeginEditing方法中,我们可以用下列代码找出键盘的UIView并设置其hidden属性。代码在iOS4.3上测试通过(真机)。
-(void)textViewDidBeginEditing:(UITextView *)textView{
UIView* kbView=nil;
NSArray *ws = [[UIApplication sharedApplication] windows];
for(UIView *w in ws){
NSArray *vs = [w subviews];
for(UIView *v in vs){
if([[NSString stringWithUTF8String:object_getClassName(v)] isEqualToString:@"UIPeripheralHostView"]){
kbView=v;
break;
}
}
}
if (segmentControl.selectedSegmentIndex==1) {
kbView.hidden=YES;
}else{
kbView.hidden=NO;
[textview becomeFirstResponder];
}
}
差不多就是这样了,还有一点小问题。在UISegmentControl控件的valueChanged方法中,我们需要把Text View先设置为resignFirstResponder然后再becomeFirstResponder。如果不这样,当你从“常用意见”切换到“键盘”时,键盘不会显示。仔细想想,你知道这是为什么。