隐藏软键盘的另一种方法

来源:互联网 发布:lof基金与etf基金知乎 编辑:程序博客网 时间:2024/05/11 05:44

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。如果不这样,当你从“常用意见”切换到“键盘”时,键盘不会显示。仔细想想,你知道这是为什么。



原创粉丝点击