作者: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 同設為一個稍大的數值,即擴大內容的高度,使下面留有足夠的空白用於顯示軟鍵盤。這樣雖然不夠精緻,但也能解決遮擋問題。