系列文集:爆棧熱門(mén) iOS 問(wèn)題。目錄在此。倉(cāng)薯翻譯,歡迎指正:)
問(wèn)題
iOS 上的鍵盤(pán)彈出會(huì)擋住輸入框,怎么處理?
答案
倉(cāng)薯注:處理鍵盤(pán)遮擋是 iOS 上老生常談的問(wèn)題,到處都是大段大段的代碼,本問(wèn)題下也不例外。我個(gè)人一直用 IQKeyboardManager,有動(dòng)畫(huà)/能復(fù)原/兼容 UITableView 等/基本一行代碼都不用寫(xiě),在大部分情況下能完美解決問(wèn)題。因此只在此翻譯一下 IQKeyboardManager 作者的答案。對(duì)其他答案有興趣的讀者請(qǐng)前往原文。
想要在整個(gè)工程里全局解決這個(gè)問(wèn)題,可以使用我寫(xiě)的 IQKeyboardManager,下面是我實(shí)現(xiàn)的思路:
第1步: 我在一個(gè)單例類(lèi) IQKeyboardManager 里添加了全局監(jiān)聽(tīng) UITextField、UITextView以及UIKeyboard事件的通知。
第2步: 如果收到了
UIKeyboardWillShowNotification、UITextFieldTextDidBeginEditingNotification、 UITextViewTextDidBeginEditingNotification這些鍵盤(pán)彈出的通知,我會(huì)從UIWindow.rootViewController的 view 層級(jí)里面找到當(dāng)前位于最頂層的 ViewController,叫做topMostViewController。為了讓正在編輯的UITextField或UITextView不被遮擋,我們要調(diào)整topMostViewController.view的 frame。
第3步: 計(jì)算出 topMostViewController.view 應(yīng)該上移多少才能把正在編輯的UITextField或UITextView露出來(lái)。
第4步: 按照剛才算出的數(shù)值,我把topMostViewController.view.frame向上移動(dòng)。
第5步: 如果收到了
UIKeyboardWillHideNotification、UITextFieldTextDidEndEditingNotification或UITextViewTextDidEndEditingNotification這些鍵盤(pán)收起的通知,我仍然是從UIWindow.rootViewController的 view 層級(jí)里面找到當(dāng)前位于最頂層的topMostViewController。
第6步: 計(jì)算現(xiàn)在topMostViewController.view應(yīng)該下移多少才能復(fù)原。
第7步: 根據(jù)剛才算出的數(shù)值,我把topMostViewController.view.frame復(fù)原。
第8步: 我會(huì)在 app 啟動(dòng)的時(shí)候初始化 IQKeyboardManager 這個(gè)單例,所以 app 里的每一個(gè)帶有UITextField和UITextView的地方都會(huì)自動(dòng)調(diào)整。
這些就是 IQKeyboardManager 所做的事,你真的一行代碼都不用寫(xiě)!! 只需要把相關(guān)的代碼文件拖到工程里就可以了。并且IQKeyboardManager 還支持橫豎屏旋轉(zhuǎn)、自動(dòng)顯示 UIToolBar、讀取 keyboardDistanceFromTextField,還有好多意想不到的功能~
原文地址:How to make a UITextField move up when keyboard is present
譯者:@戴倉(cāng)薯