Swift5 UITextField適應(yīng)第三方鍵盤(pán)跟隨高度解決方案

最近碰到個(gè)問(wèn)題,UITextField跟隨鍵盤(pán)高度做調(diào)整,避免被軟鍵盤(pán)遮擋,理想方法是監(jiān)聽(tīng)鍵盤(pán)彈起和收回的通知來(lái)達(dá)到效果。在系統(tǒng)自帶的鍵盤(pán)中是完全沒(méi)有問(wèn)題的,但在第三方鍵盤(pán)(如百度、搜狗輸入法)居然會(huì)觸發(fā)3次 keyboardWillShowNotification通知,每次的高度居然還不一樣

目前網(wǎng)傳的辦法是只記錄最后一次的高度,本人經(jīng)過(guò)多次實(shí)驗(yàn),效果幾乎是很差的。經(jīng)過(guò)最后的修改已經(jīng)完美解決這個(gè)問(wèn)題,特地在此栽樹(shù)以備后人乘涼。直接上步驟:

因?yàn)槲覍?xiě)的功能是從底部彈出Dialog,同時(shí)彈出鍵盤(pán)并跟隨鍵盤(pán)高度自動(dòng)變化,如果你是需要改變VC中的UITextField,參考此代碼稍作修改即可。

var centerY = self.textField.center.y //記錄textField原始的y值
var keyboardHeight:CGFloat = 0.0  //設(shè)定一個(gè)變量來(lái)記錄鍵盤(pán)高度
// 監(jiān)聽(tīng)鍵盤(pán)彈出通知
NotificationCenter.default.addObserver(self, selector: #selector(keyboardShow(note:)), name:UIResponder.keyboardWillShowNotification,object: nil)
// 監(jiān)聽(tīng)鍵盤(pán)隱藏通知
NotificationCenter.default.addObserver(self,selector: #selector(keyboardHidden(note:)),
            name: UIResponder.keyboardWillHideNotification, object: nil)


//鍵盤(pán)彈出監(jiān)聽(tīng)
    @objc func keyboardShow(note: Notification)  {
        guard let userInfo = note.userInfo else {return}
        guard let keyboardRect = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else{return}
        //獲取動(dòng)畫(huà)執(zhí)行的時(shí)間
        var duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double
        if duration == nil { duration = 0.25 }
  
       //獲取鍵盤(pán)彈起的高度
        let keyboardTopYPosition = keyboardRect.height
        keyboardHeight = keyboardTopYPosition

        UIView.animate(withDuration: duration!, delay: 0, options: .allowAnimatedContent, animations: {
            self.textField.center.y = (self.centerY - keyboardTopYPosition)
            //這一步是至關(guān)重要的,設(shè)置當(dāng)前textField的y值為原始y值減去鍵盤(pán)高度,由于始終是用原始y值去減,所以不管通知幾次都不會(huì)錯(cuò)
        }, completion: nil)
  
    }

//鍵盤(pán)隱藏監(jiān)聽(tīng)
    @objc func keyboardHidden(note: Notification){
        UIView.animate(withDuration: 0.3, delay: 0, options: .allowAnimatedContent, animations: {
            self.textField.center.y += self.keyboardHeight
          //用當(dāng)前的y值加上鍵盤(pán)高度,最終使得textField回歸原位
        }, completion: nil)
    }

    deinit {
        //記得要取消鍵盤(pán)通知的監(jiān)聽(tīng)
        NotificationCenter.default.removeObserver(self)
    }

我也是Swift初學(xué)者,因?yàn)橐恢倍荚诤?jiǎn)書(shū)查閱大佬們的代碼,希望我記錄的這個(gè)文章能夠解決你的問(wèn)題,目前我使用的版本為Swift5,測(cè)試是沒(méi)有任何問(wèn)題的,能解決你的問(wèn)題請(qǐng)給我雙擊評(píng)論666

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容