最近碰到個(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