Demo地址:https://github.com/liuzhiyi1992/ZYKeyboardUtil
我博客原文:http://zyden.vicp.cc/zykeyboardutil/
歡迎轉(zhuǎn)載,請(qǐng)注明出處,謝謝
鍵盤遮蓋輸入控件或按鈕在日常app開發(fā)中避之不及,考慮各種情況下UI各種嵌套,最后還要注冊(cè)監(jiān)聽再獲取指定鍵盤信息。我們可以通過(guò)鍵盤處理工具類ZYKeyboardUtil避繁就簡(jiǎn),利用Block的方式處理鍵盤遮蓋問(wèn)題。
主要應(yīng)對(duì):
- 橫豎屏鍵盤遮擋輸入控件問(wèn)題
- 第三方鍵盤多次彈出的坑
- 視圖多層嵌套內(nèi)輸入控件處理
- 單頁(yè)面內(nèi)多個(gè)輸入控件處理
ZYKeyboardUtil 通過(guò)lazy方式注冊(cè)鍵盤通知監(jiān)聽者,一個(gè)Block全自動(dòng)處理鍵盤遮擋事件(處理/恢復(fù)),另外附帶兩個(gè)自定義動(dòng)作Block供使用者自己處理。內(nèi)部類KeyboardInfo充當(dāng)model存儲(chǔ)著每次處理時(shí)所需的鍵盤信息。
配置animateWhenKeyboardAppearAutomaticAnimBlock即可全權(quán)交于ZYKeyboardUtil處理鍵盤遮擋輸入控件問(wèn)題的發(fā)生。
附帶的自定義動(dòng)作Block中,animateWhenKeyboardAppearBlock作鍵盤展示時(shí)的處理,animateWhenKeyboardDisappearBlock作鍵盤收起時(shí)的處理,而printKeyboardInfoBlock用作在必要時(shí)輸出鍵盤信息。AppearBlock和DisappearBlock統(tǒng)一加入了UIViewAnimation,使用時(shí)只需要編寫需要的界面變化即可。
橫豎屏試驗(yàn):

輸入控件多層嵌套:

第三方鍵盤分次彈出問(wèn)題:

如何使用:
在我們的controller中,創(chuàng)建一個(gè)ZYKeyboard對(duì)象,為了讓其生存在整個(gè)頁(yè)面實(shí)現(xiàn)功能的時(shí)間段內(nèi),讓你的controller持有他。
self.keyboardUtil = [[ZYKeyboardUtil alloc] init];
處理鍵盤事件:
配置animateWhenKeyboardAppearAutomaticAnimBlock,即可全自動(dòng)處理鍵盤升降遮擋輸入控件問(wèn)題,且控件resignFirstResponder后自動(dòng)還原。
只需在Block里利用參數(shù)keyboardUtil調(diào)用adaptiveViewHandleWithController:adaptiveView:,第一個(gè)參數(shù)為當(dāng)前頁(yè)面controller,第二個(gè)參數(shù)接收一個(gè)可變參數(shù),為當(dāng)前頁(yè)面內(nèi)的單個(gè)/多個(gè)輸入控件或者包裹輸入控件的View。
__weak ViewController *weakSelf = self;
[_keyboardUtil setAnimateWhenKeyboardAppearAutomaticAnimBlock:^(ZYKeyboardUtil *keyboardUtil) {
[keyboardUtil adaptiveViewHandleWithController:weakSelf adaptiveView:weakSelf.inputViewOne, weakSelf.inputViewSecond, weakSelf.inputViewThird, weakSelf.inputViewFourth, nil];
}];
以下為附加的自定義動(dòng)作Block:
//展開事件
[_keyboardUtil setAnimateWhenKeyboardAppearBlock:^(int appearPostIndex, CGRect keyboardRect, CGFloat keyboardHeight, CGFloat keyboardHeightIncrement) {
//do something when keyboard appear
}];
appearPostIndex是 鍵盤分次展開時(shí)(第三方鍵盤會(huì)分次展開) 用于記錄當(dāng)前為同一次展開的第幾次上升。
keyboardRect為此次展開后鍵盤位置的Rect。
keyboardHeight為此次展開后鍵盤高度。
keyboardHeightIncrement為此次展開鍵盤的增量。(應(yīng)付第三方鍵盤分次展開的關(guān)鍵)。
//收起事件
[_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
}];
在這個(gè)Block的參數(shù)中可以獲得鍵盤信息keyboardInfo。
注意不要忘了通過(guò)weakSelf來(lái)避免Block的循環(huán)引用:
__weak ViewController *weakSelf = self;