最近、このプロジェクトでは、Appleシステムの入力方法が入力ボックスを塞ぐという問題を解決する必要があります。期待される結果は次のとおりです。
- キーボードがポップアップした後に入力ボックスがブロックされる場合、キーボードがポップアップすると入力ボックスが上に移動し、入力方法が切り替えられても入力ボックスは常にキーボードの上に残ります。
- キーボードがポップアップ時に入力ボックスをブロックしないが、入力方法を切り替えた後に入力ボックスをブロックする場合は、切り替え後に入力ボックスを上に移動する必要があり、入力方法を切り替えても入力ボックスはキーボードの上に残ります。
1.背景
開発環境:iOS14 + Xcode v12.0.1 + Swift5
デバイス:iPhoneSE(他のモデルで有効)
ページは自動レイアウトを採用
2.実装
1.キーボードの変更を監視し、キーボードの高さを取得します
viewWillAppearにキーボードのポップアップ、折りたたみ、フレーム変更の通知を追加します
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardWillAppear),
name: UIResponder.keyboardWillShowNotification,
object: nil)
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardHasAppear),
name: UIResponder.keyboardDidShowNotification,
object: nil)
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardWillDisappear),
name: UIResponder.keyboardWillHideNotification,
object: nil)
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardFrameDidChange),
name: UIResponder.keyboardDidChangeFrameNotification,
object: nil)
(添付:iOSキーボード通知https://www.jianshu.com/p/6af9feb7f86f)
キーボードが表示されます:
@objc
func keyboardWillAppear(noti: Notification) {
// 获得软键盘的高
let keyboardSize = (noti.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
let keyboardHeight = keyboardSize?.height
// 计算输入框和软键盘的高度差
let rect = self.nickNameEditView.containerView
.convert(self.nickNameEditView.containerView.bounds,
to: self.view) // 将rect由rect所在视图转换到目标视图view中,返回在目标视图view中的rect
self.nameFieldBottomHeight = self.view.bounds.height - (rect.origin.y + rect.size.height)
self.deltaHeight = (keyboardHeight ?? 0) - self.nameFieldBottomHeight
if self.keyboardFlag == 0, self.deltaHeight > 0 {
// 键盘原来是收起的,且遮挡输入框
self.pageContainerView.transform = CGAffineTransform(a: 1, b: 0, c: 0, d: 1,
tx: 0, ty: -self.deltaHeight - 4)
self.transformDistance = -self.deltaHeight - 4
}
}
かつキーボードが表示されます:
@objc
func keyboardHasAppear() {
self.keyboardFlag = 1 // 键盘已弹出
}
後で追加するために、ピットを残します