iOS—收起虚拟键盘的各种方法
本文章转自—http://justcoding.iteye.com/blog/1476171
使用虚拟键盘来输入资讯,是iOS的重要互动方式之一,虚拟键盘通常会自动出现在可以编辑的UITextField或是 UITextView 的编辑事件中,叫出键盘固然容易,但是要把它收起来,可就没有这么简单,之前在 UITextField 输入结束后的收起小键盘的方式一文中,介绍了如何在编辑完成之后收起虚拟键盘,但是如果您的元件并没有对应的事件可以让你收起虚拟键盘,那又该如何做?下列我们以类似的元件 UITextView 为例,介绍一些通用的方法。
1.点击编辑区以外的地方(UIView)
这是一种很直接的方法,当不再需要使用虚拟键盘的时候,只要点击虚拟键盘和编辑区域以外的地方,就可以将键盘收起,下面程式码是在UIView中内建的触碰事件方法函数。
c代码
1 -(void)toucheEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 2 if(![myTextView isExclusiveTouch]){ 3 [myTextView resignFirstResponder]; 4 } 5 }
如果要使用此方式请务必记得,你操作画面的 Custom Class 一定是UIView才行。画面的Custom Class 为 UIView
2.点击编辑区域意外的地方(UIControl)
收起虚拟键盘的方式与前一种相同,但是如果你的触碰事件里已经且写满了程式码,那么就可以考虑使用,UIControl的Touch Up Inside 事件来收起键盘,方法是将以下程式码与UIcontrol的Touch Up Inside事件连结即可。
c代码
1 -(void)dismissKeyboard:(id)sender{ 2 3 [myTextView resignFirstResponder]; 4 5 }
如果要使用此方式,请务必记得,你操作画面的Custom Class 一定要是 UIControl 才行,将收起键盘的方法与UIControl事件连结
3.使用只做收起键盘的按钮
当没有编辑区域以外的地方可供点击来收起键盘,自己制作一个按钮来收起目前的虚拟键盘,也是一个不错的方法,由于按钮必须在虚拟键盘出现才能显示于画面上, 因此必须借用NSNotificationCenter 来帮助我们判断目前键盘的状态,您可以在类似 Observer Pattern 的 NSNotificationCenter 一文中,找到更多关于 NSNotificationCenter 的资讯。
首先在 viewDidLoad: 事件中,向 NSNotificationCenter 进行註册,告诉 NSNotificationCenter 我们的 doneButtonshow: 方法函式,想要订阅有关 UIKeyboardDidShowNotification 的讯息事件。
c代码
1 -(void)viewDidLoad{ 2 [super viewDidLoad]; 3 4 [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doneButtonshow:) name: UIKeyboardDidShowNotification object:nil]; 5 }
现在每当虚拟键盘出现时,就会自动呼叫我们自定义的doneButtonshow:方法函数,接下来只要在刚方法函数里定义按钮出现的方法即可。
c代码
1 -(void)doneButtonshow:(NSNotification *)notification 2 { 3 doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 4 doneButton.frame = CGRectMake(0,228,70,35); 5 [doneButton setTitle:@"完成编辑" forState:UIControlStateNormal]; 6 [doneButton addTarget:self action:@selector(hideKeyboard) forControlEvents:UIControlEventTouchUpInside]; 7 [self.view addSubview:doneButton]; 8 }
最后是实作按钮按下去时的hideKeyboard:方法函数,务必记得要在函数中移除该按钮。
c代码
1 -(void)hideKeyboard 2 { 3 [doneButton removeFromSuperview]; 4 [myTextView resignFirstResponder]; 5 }
4.使用判断段输入字元
如果要使用输入特定字元(例如return换行字元)来收起键盘,必须现在类别内的 @interface区段采用协定。
在采用协定之后,接着实作出协定内的textView:shouldChangeTextInRange:replacementText:方法,此方法函数会在字元输入时触发,而回传的BOOL值则代表该字元是否要作用,下列程式码就是在此方法函数中,使用判断输入字元的方法来收起虚拟键盘(判断字元为return换行字元).
c代码
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([text isEqualToString:@"\n"]){ [myTextView resignFirstResponder]; return NO; } return YES; }
最后别忘记在viewDidLoad:事件中,将UITextView的代理事件指向自己,这样程式才能正确找到实作协定方法函式的类别。
c代码
1 -(void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 myTextView.delegate = self; 5 }