鍵盤遮蓋輸入控件或按鈕在日常app開發中避之不及,考慮各種情況下UI各種嵌套,最後還要注冊監聽再獲取指定鍵盤信息。我們可以通過鍵盤處理工具類ZYKeyboardUtil避繁就簡,利用Block的方式處理鍵盤遮蓋問題。
Demo地址:https://github.com/liuzhiyi1992/ZYKeyboardUtil
主要應對:
橫豎屏鍵盤遮擋輸入控件問題
第三方鍵盤多次彈出的坑
視圖多層嵌套內輸入控件處理
單頁面內多個輸入控件處理
ZYKeyboardUtil 通過lazy方式注冊鍵盤通知監聽者,一個Block全自動處理鍵盤遮擋事件(處理/恢復),另外附帶兩個自定義動作Block供使用者自己處理。
內部類KeyboardInfo充當model存儲著每次處理時所需的鍵盤信息。
配置animateWhenKeyboardAppearAutomaticAnimBlock即可全權交於ZYKeyboardUtil處理鍵盤遮擋輸入控件問題的發生。附帶的自定義動作Block中,animateWhenKeyboardAppearBlock作鍵盤展示時的處理,animateWhenKeyboardDisappearBlock作鍵盤收起時的處理,而printKeyboardInfoBlock用作在必要時輸出鍵盤信息。AppearBlock和DisappearBlock統一加入了UIViewAnimation,使用時只需要編寫需要的界面變化即可。
橫豎屏試驗:
輸入控件多層嵌套:
第三方鍵盤分次彈出問題:
如何使用:
在我們的controller中,創建一個ZYKeyboard對象,為了讓其生存在整個頁面實現功能的時間段內,讓你的controller持有他。
self.keyboardUtil = [[ZYKeyboardUtil alloc] init];
處理鍵盤事件:
配置animateWhenKeyboardAppearAutomaticAnimBlock,即可全自動處理鍵盤升降遮擋輸入控件問題,且控件resignFirstResponder後自動還原。 只需在Block裡利用參數keyboardUtil調用adaptiveViewHandleWithController:adaptiveView:,第一個參數為當前頁面controller,第二個參數接收一個可變參數,為當前頁面內的單個/多個輸入控件或者包裹輸入控件的View。
__weak ViewController *weakSelf = self; [_keyboardUtil setAnimateWhenKeyboardAppearAutomaticAnimBlock:^(ZYKeyboardUtil *keyboardUtil) { [keyboardUtil adaptiveViewHandleWithController:weakSelf adaptiveView:weakSelf.inputViewOne, weakSelf.inputViewSecond, weakSelf.inputViewThird, weakSelf.inputViewFourth, nil]; }];
以下為附加的自定義動作Block:
//展開事件 [_keyboardUtil setAnimateWhenKeyboardAppearBlock:^(int appearPostIndex, CGRect keyboardRect, CGFloat keyboardHeight, CGFloat keyboardHeightIncrement) { //do something when keyboard appear }];
appearPostIndex是 鍵盤分次展開時(第三方鍵盤會分次展開) 用於記錄當前為同一次展開的第幾次上升。
keyboardRect為此次展開後鍵盤位置的Rect。
keyboardHeight為此次展開後鍵盤高度。
keyboardHeightIncrement為此次展開鍵盤的增量。(應付第三方鍵盤分次展開的關鍵)。
//收起事件 [_keyboardUtil setAnimateWhenKeyboardDisappearBlock:^(CGFloat keyboardHeight) { //do something to restor UI when keyboard dismiss }];
keyboardHeight為鍵盤收起前的高度。
//獲取鍵盤信息 [_keyboardUtil setPrintKeyboardInfoBlock:^(ZYKeyboardUtil *keyboardUtil, KeyboardInfo *keyboardInfo) { //you can get keyboardInfo here when animation ended }];
在這個Block的參數中可以獲得鍵盤信息keyboardInfo。
注意不要忘了通過weakSelf來避免Block的循環引用: __weak ViewController *weakSelf = self;