工作中發(fā)現(xiàn)棠绘,在webView中苟翻,如果h5內(nèi)容自己的container中引入了劃動(dòng)控件,再在控件中通過(guò)input標(biāo)簽調(diào)起鍵盤(pán)檩坚,會(huì)導(dǎo)致webView中的視圖發(fā)生向上偏移着撩,將navigationbar頂出屏幕,同時(shí)webView的contentSize超出可視區(qū)域匾委。
針對(duì)以上情況拖叙,通過(guò)監(jiān)聽(tīng)keyboard的變化事件,實(shí)時(shí)改變webView的frame可以解決該問(wèn)題
增加對(duì) 鍵盤(pán)彈出/縮回 事件的監(jiān)聽(tīng)
funcaddKeybaordObserve() {
NotificationCenter.default.addObserver(self, selector: #selector(containerResizingFor(showingKeyboardNoti:)), name:NSNotification.Name.UIKeyboardWillShow, object:nil)
NotificationCenter.default.addObserver(self, selector: #selector(containerResizingFor(hidingKeyBoardNoti:)), name:NSNotification.Name.UIKeyboardWillHide, object:nil)
}
添加監(jiān)聽(tīng)到通知后的處理方法
@objc func containerResizingFor(showingKeyboardNoti: Notification) {
guard let info = showingKeybboardNoti.userInfo else { return }
let value = info[UIKeyboardFrameEndUserInfoKey] as! NSValue
let kbHeight = value.cgRectValue.height
self.webView.frame = CGSize(width: view.frame.width, height: view.frame.height - kbHeight)
webView.setNeedsLayout()
}
@objc func containerResizingFor(hidingKeyBoardNoti: Notification) {
self.webView.frame = view.frame
self.webView.setNeedsLayout()
}
這里有點(diǎn)地方需要存疑赂乐,修改WKWebView的scrollView.contentSize同樣可以生效薯鳍,但是效果有時(shí)會(huì)不穩(wěn)定,存在閃動(dòng)等問(wèn)題挨措,因此這里還是選擇了修改WebView的frame
最后挖滤,還要記得在deinit方法里將觀察者移除——
deinit {
NotificationCenter.default.removeObserer(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserer(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}