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