iOS 解决键盘遮挡输入框问题,输入框随键盘弹起上移,切换输入法时动态调整

最近在项目中需要解决苹果系统输入法遮挡输入框的问题,预期结果为:

  1. 若键盘弹出后会遮挡输入框,则输入框随键盘弹起上移,输入法切换时输入框始终保持在键盘上方;
  2. 若键盘弹出后不会遮挡输入框,但切换输入法后会遮挡输入框,则输入框需要在切换后上移,随后输入法切换时输入框始终保持在键盘上方。

一. 背景

开发环境:iOS14 + Xcode v12.0.1 + Swift5
设备:iPhoneSE(其他机型测试有效)
页面采用自动布局

二. 实现方式

1. 监听键盘变化,获取键盘高度

在viewWillAppear中添加键盘弹出、收起、frame变化的通知

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)

实现 keyboardWillAppear:

@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
    }
}

实现keyboardHasAppear:

@objc
func keyboardHasAppear() {
    
    
    self.keyboardFlag = 1 // 键盘已弹出
}

留坑,后续待补充

猜你喜欢

转载自blog.csdn.net/fusy0714/article/details/109076048