1. 程式人生 > >UITextField,UITextView實現鍵盤的自動隱藏以及遮擋時自動上移的功能

UITextField,UITextView實現鍵盤的自動隱藏以及遮擋時自動上移的功能

       眾所周知,iOS下實現文字的輸入都會在介面上佈局UITextField或者UITextView這兩種控制元件。這三種輸入控制元件在變為第一響應者(BecomeFirstResponder)時會彈出鍵盤視窗,而當控制元件失去第一響應者(ResignFirstResponder)時則鍵盤視窗會隱藏。在實際程式設計時我們需要編碼來控制輸入框何時需要失去第一響應者,比如在使用者按下了鍵盤的return按鍵或者按下了Done按鍵,或者使用者按下了一個提交按鈕,或者使用者在空白處執行了觸控操作等。要完成上述的任何一種效果,我們都需要在程式的對應的事件裡面新增輸入控制元件的resignFirstResponder方法的呼叫,如果介面裡面有多個輸入控制元件時則處理起來更加麻煩。

       在使用輸入控制元件時,因為鍵盤視窗的彈出可能會導致介面底部的檢視包括輸入控制元件本身被鍵盤視窗遮擋,為了不影響使用者使用程式的體驗,我們還需要程式設計來處理檢視的移動問題,當介面被鍵盤視窗擋住時我們需要程式設計讓被遮擋的部分檢視往上移動,而當鍵盤視窗隱藏時則需要將上移的檢視恢復原狀。當某個介面有多個輸入控制元件時我們還可能需要切換不同的輸入控制元件時,所移動幅度不同。

       為了解決上述兩個問題,我們可以通過過載UITextField,UITextView兩個類的派生類,並加入特殊的程式碼來解決問題;我們也可以在鍵盤視窗中增加一個ToolBar並在裡面增加上一項,下一項,取消等按鈕來解決焦點的切換和鍵盤的隱藏等功能;我們也可以在每個具有輸入控制元件中的檢視控制器中新增程式碼來解決問題。這三種方法的實現各有千秋,而且網路上也具有了很多優秀的開源專案來解決這個問題。但是這些解決方法唯一的問題就是或多或少的需要在程式中編寫附加的程式碼,而且有一些還有學習成本。

      但是這些問題都是可以解決的,請訪問使用https://github.com/youngsoft/YSTextInputKeyboardCategory中的機制,您只需要將其中的UIView+YSTextInputKeyboard.h和UIView+YSTextInputKeyboard.m複製到您的工程即可,然後您所有的UITextField,UITextView就有了自動的鍵盤隱藏和遮擋時的自動移動能力了!要隱藏鍵盤時只要您在空白處單擊觸控或者執行向下滑動手勢,鍵盤就自動隱藏,而且當某個介面底部的輸入控制元件變為第一個響應者時系統自動會將試圖往上移動,而當失去第一響應者時又會自動往下移動。

   當然如果系統預設的功能不能滿足您的要求,您也可以自定義當遮擋時哪個檢視移動,以及移動的偏移值是多少。這個輸入控制元件實現原理其實也是利用了object-c的runtime機制和手勢來實現的。我們可以通過使用UIView的擴充套件分類裡面的擴充套件屬性kbMoving來設定當鍵盤遮擋時需要移動的檢視,以及移動的偏移量。我們也可以為某些其他的需要支援inputView的控制元件提供了整合的方法。具體請見github中的demo.