看下图1
但是在IOS5的情况下,中文输入法在键盘右边的按钮就会被选词区遮盖了。
请看图2
隐藏键盘的按钮被系统的选词区遮盖了,基于这个状况,希望用户能够点击键盘区域以外的地方也能隐藏键盘。
所以如何知道用户点击键盘以为区域就显得很重要了
由于在ViewController中不能捕获以下Touch事件,以下Touch主要是针对UIView的
所以我们无法通过Touches来判读用户是否点击了键盘以外区域,所以我选择了UITapGestureRecognizer,通过捕获用户的tap事件,来隐藏键盘。
在ViewDidLoad里添加如下的方法
{
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyBoard:)];
[tapGesture setNumberOfTapsRequired:1];
[self.view addGestureRecognizer:tapGesture];
[tapGesture release];
}
我以为一切运行良好。。。。。
可惜实际的情况并不是那么理想,比如画面1中有UISwitch和UIButton, UITapGestureRecognizer会隐藏了UISwitch 和UIButton等一切能响应用户Tap的控件。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
if ([touch.view isKindOfClass:[CustomUISwitch class]] || [touch.view isKindOfClass: [UIButton class]] )
{
return NO;
}
return YES;
}
同时addTapCuesture也需要做如下修改,添加 tapGesture.delegate = self;
修改后的代码如下
{
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(confirmAction:)];
tapGesture.delegate = self;
[tapGesture setNumberOfTapsRequired:1];
[self.view addGestureRecognizer:tapGesture];
[tapGesture release];
}
(当然你也可以设置为在点击UITableView的时候也隐藏键盘,但这个基本不要过滤)
还是回到上面的思路,在gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch里过滤掉Cell。
然后在gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 里判断,方法如下 :
{
if (touch.view.tag ==k_cell_view_tag )
{
return NO;
}
return YES;
}
接着解决第二个问题,如何解决滑动TableView的时候隐藏键盘
我们在UIScrollDelegate的scrollViewWillBeginDragging隐藏键盘
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
[self hideKeyBoard];
}
到此,用户想隐藏键盘就非常方便了。
可以参考这个地址http://stackoverflow.com/questions/594181/uitableview-and-keyboard-scrolling-issue