作者:zyl910
“点击空白处隐藏软键盘”是一个很常见的功能。最简单的实现办法是将背景View设为为UIControl类,然后在Touch Down事件中隐藏软键盘。详见 http://www.cnblogs.com/zyl910/archive/2013/03/29/ios_textfield_keyboard.html。
但是当文本框放在UIScrollView控件中时,上述方法就失效了。UIScrollView本身没有提供触摸事件,但它会拦截触摸操作,使背景View无法收到触摸事件。
该怎么办呢?
曾在网络上找到过一个解决方案——写UIScrollView的派生类,提供触摸事件。该方案存在不少缺点,如代码复杂、触摸事件容易与UIScrollView的拖曳滚动功能冲突。实用性不高。
今天我突然想到了完美的解决方案。只需在界面中多加一个控件,不需增加代码,可沿用原来“View中点击空白处隐藏软键盘”的代码。而且隐藏软键盘操作不会与UIScrollView的拖曳滚动功能冲突。哈哈,厉害吧!
前面吹嘘了那么多,其实解决方案十分简单,类似脑经急转弯。
具体办法——
1. 在UIScrollView中放一个View。
2. 在该View中放置各种控件。
3. 将该View的类名改为UIControl,处理Touch Down 事件关闭软键盘。
本来我担心UIScrollView上面的View会拦截触摸事件,使UIScrollView不能正常拖曳滚动。但运行后发现效果完美。
这是因为UIScrollView优先抢占了触摸事件,当它判断不是拖曳滚动时,才会放弃对触摸事件的抢占,使它上面的View接收到触摸事件。
其次关于关闭软键盘,我找了更简单的代码——
- (IBAction)view_TouchDown:(id)sender { [self.view endEditing:YES]; }
最后是关于软键盘遮挡问题的处理心得。
当软键盘显示时,UIScrollView不会自动缩小到非软键盘区域,导致下半部分被遮挡、无法操作。
对于这个问题,常规办法是接收软键盘显示/隐藏通知,然后人工计算非软键盘区域的尺寸,再设置UIScrollView的位置。该方法不仅代码复杂,而且难以适应横屏模式及有很多控件的情况。
我是这样处理的——将UIScrollView的Content Insets Bottom 与 View的Height 同设为一个稍大的数值,即扩大内容的高度,使下面留有足够的空白用于显示软键盘。这样虽然不够精致,但也能解决遮挡问题。