根據鍵盤調整textField(多個)位置使其不會被鍵盤擋住,textfield擋住
當一個介面上有個textField時,鍵盤出現時需要保證textField不會被鍵盤擋住。一般的做法是,監聽 UIKeyboardWillShowNotification和 UIKeyboardWillHideNotification,在通知的selector方法中通過notification.userInfo擷取鍵盤的相關資訊,然後調整介面的位置。 但是當介面上有兩個以上的textField時,問題來了:在textField之間切換的時候UIKeyboardWillShowNotification這個通知不一定會發!據觀察,只有當鍵盤的大小發生變化的時候,系統才會再次發出UIKeyboardWillShowNotification通知。。。例如數字鍵台變到英文鍵盤,鍵盤大小不變,所以不會發通知,英文鍵盤變到中文鍵盤,鍵盤大小改變,所以會再發一次willShow通知,其他類似 所以問題是:介面上有多個textField,有的被擋住了,有的沒有被擋住,想要在切換textField的時候每次都可以把目標textField移動到不被擋住的位置,怎麼辦?(最常見的,登陸介面有帳號,密碼兩個textField,兩個都輸入的時候分別要移動到合適的位置) 在
- (void)textFieldDidBeginEditing:(UITextField *)textField的時候調整位置?如果這時候鍵盤還沒出現,那這個方法的調用是在系統發UIKeyboardWillShowNotification通知之前的如果鍵盤已經出現,那系統可能不會再發UIKeyboardWillShowNotification通知,這時候你不一定知道鍵盤的大小,(而且問題是系統不一定發,如果是一定不發,那還好處理一點)如果記錄下來第一次鍵盤出現時鍵盤的大小,切換textField的時候依然用這個儲存的大小,那調整的位置可能不準。。。如果針對這一個viewController來寫死某些數值的話,那適配3.5寸或者4寸或者4.7寸或者5.5寸螢幕的時候,又該出問題了 這個問題困擾了我很久,後來研究了github上大神的代碼,才找到比較理想的解決方案,大神的第三方庫:
TPKeyboardAvoiding
IQKeyboardManager
這兩個庫都很好的解決了上述問題,但
TPKeyboardAvoiding用起來稍微有點麻煩,需要繼承,
IQKeyboardManager功能很強大,但是相對也就比較複雜,我是沒看懂怎麼用(慚愧)。。。 所以我就自己寫了一個庫,基本也解決了上述的問題,功能也相對簡單,用起來也相對簡單。demo地址:https://github.com/Phelthas/LXMKeyboardManager 核心思路是:1,用一個單獨的類來儲存keyboard的相關狀態2,把textField調整到螢幕可視範圍內的適當位置,而不是緊貼著鍵盤(參考TPKeyboardAvoiding的思路)3,用一個isKeyboardShow的屬性來記錄鍵盤是否已經出現,然後根據這個狀態來做出不同的調整4,鍵盤通知的selector裡只需處理isKeyboardShow的狀態 效果 現在可以支援scrollView,tableView,collectionView或者cell上的textField,其他有需要可以再加如果有什麼bug,歡迎指出,大家一起討論