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

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

效果示意:

一. 背景

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

二. 实现方式

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

override func viewWillAppear(_ animated: Bool) {super.viewWillAppear(animated)// 键盘弹出监听,解决键盘挡住输入框的问题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键盘通知)

添加成员变量:

private var keyboardFlag: Int = 0 // 键盘弹起情况,收起=0
private var deltaHeight: CGFloat = 0 // 键盘与输入框间距
private var nameFieldBottomHeight: CGFloat = 0 // 输入框底部到页面底部距离
private var transformDistance: CGFloat = 0 // 页面移动距离

实现 keyboardWillAppear:

@objc
func keyboardWillAppear(noti: Notification) {// 获得软键盘的高let keyboardSize = (noti.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValuelet keyboardHeight = keyboardSize?.height// 计算输入框和软键盘的高度差/* nickNameEditView.containerView:输入框 */let rect = self.nickNameEditView.containerView.convert(self.nickNameEditView.containerView.bounds,to: self.view) // 将rect由rect所在视图转换到目标视图view中,返回在目标视图view中的rectself.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/* -4:为了使键盘距离输入框底部距离为4pt,该值可改 *//* pageContainerView:需要移动的控件,包成一个view */}
}

实现keyboardHasAppear:

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

实现keyboardWillDisappear:

@objc
func keyboardWillDisappear() {if self.keyboardFlag == 0 {// 软键盘收起的时候恢复原始偏移self.pageContainerView.transform = CGAffineTransform.identityself.transformDistance = 0}
}

实现 keyboardFrameDidChange,解决切换输入法动态调整:

@objc
func keyboardFrameDidChange(noti: Notification) {// 获得软键盘的高let keyboardSize = (noti.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValuelet keyboardHeight = keyboardSize?.height// 计算输入框和软键盘的高度差self.deltaHeight = (keyboardHeight ?? 0) - (self.nameFieldBottomHeight + self.transformDistance)// 键盘在弹出的情况下如果frame有变化就改变输入框位置if self.keyboardFlag == 1 {// 如果页面之前没有上移,键盘遮挡输入框,页面上移; 页面之前有上移,输入框下降到键盘上方4pt处if (self.transformDistance == 0 && self.deltaHeight > 0) || (self.transformDistance != 0) {self.pageContainerView.transform = CGAffineTransform(a: 1, b: 0, c: 0, d: 1,tx: 0, ty: -self.deltaHeight - 4)self.transformDistance = -self.deltaHeight - 4}}
}

点击空白区域收取键盘:

// 收起键盘
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {if self.nickNameEditView.nameTextField.isFirstResponder {self.keyboardFlag = 0self.nickNameEditView.nameTextField.resignFirstResponder()}
}

在 viewWillDisappear 中移除通知:

override func viewWillDisappear(_ animated: Bool) {super.viewWillDisappear(animated)NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardDidShowNotification, object: nil)NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardDidChangeFrameNotification, object: nil)
}

End.


由于我水平尚浅,计算和实现方法可能有很多不足,有任何问题欢迎评论交流~

iOS 解决键盘遮挡输入框问题,输入框随键盘弹起上移,切换输入法时动态调整 (Swift)相关推荐

  1. 安卓蓝牙键盘切换输入法_Windows10添加中文美式键盘,传统语言栏,采用ctrl+shift切换输入法...

    Windows10添加中文美式键盘,采用ctrl+shift切换输入法 用XP和Windows 7习惯后 用Windows 10 发现切换输入法快捷键变了,变成Windows键+空格,现在觉得不适应, ...

  2. win10添加美式键盘_Windows10添加中文美式键盘,传统语言栏,采用ctrl+shift切换输入法...

    Windows10添加中文美式键盘,采用ctrl+shift切换输入法 用XP和Windows 7习惯后 用Windows 10 发现切换输入法快捷键变了,变成Windows键+空格,现在觉得不适应, ...

  3. h5底部输入框被键盘遮挡_移动端虚拟键盘引发的问题分析

    在工作的过程中无论是与原生结合的Hybird的H5页面或者微信公众号页面都会遇到当触发键盘输入行为时,页面窗口往上离开屏幕(与iOS的适配)或者页面高度变小(在微信中打开页面等),现在我们来分析一下各 ...

  4. Xamarin开发IOS笔记:切换输入法时输入框被遮住

    在进行IOS开发的过程中,出现类似微信朋友圈的交互界面,当用户遇到感兴趣的内容可以进行评论.为了方便评论输入,当出现评论输入框的时候自动将评论输入框移动至键盘的上方,这样方便边输入边查看. 当用户隐藏 ...

  5. android 记一次解决键盘遮挡问题

    文章链接:https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw 日常android开发过程中,会遇到编辑框输入内容弹出软键盘,往往会出现键盘遮挡内容,或者 ...

  6. 切换输入法导致程序死机的解决办法

    近日在开发类似QQ屏幕截图过程中,发现在输入文字时切换输入法(Ctrl+Shift)时,会导致程序出现"卡死"现象.为了方便代码重用,屏幕截图模块是以动态库方式封装起来的.出现&q ...

  7. iOS解决表格中TextField,TextView编辑时,输入框被键盘遮挡的问题

    方法1:在原来的 UIViewController 内部再添加一层 UITableViewController 代码如下 : // // ViewController.m // 键盘遮挡问题 // / ...

  8. React-native键盘遮挡输入框问题的解决

    2016年10月25日更新: 现在有一个更准确一点的做法是用一个View包裹住TextInput,然后通过该View的onLayout方法获取该输入框的y轴位置,再减去一个适当的高度去处理scroll ...

  9. iOS键盘遮挡输入框,输入区域自动上移

    在iOS开发过程当中,遇到关于键盘遮挡输入框的问题,经过网络参考与实践,总结如下: 登录窗口,上下放置两个UITextField,一个用户名,一个密码,放置的在屏幕下方1/3处,当点击用户名时,自动弹 ...

最新文章

  1. c#.net课程设计:ZCMU通讯录(待更新)
  2. 采用晶体管为基本元件的计算机发展阶段是,计算机应用基础知识点
  3. 【Java基础篇】try catch finally语句包含return语句时的执行过程
  4. [转载] Java-forEach增强for循环是值传递规则详解
  5. 函数使用了堆栈的字节超过_Go语言复习笔记——基本语法三之堆栈与字符串应用...
  6. tcpdump: no suitable device found
  7. 计算机应用基础陈江鸿,广播电视大学计算机教育改革探索与实践-计算机教育论文-计算机论文(6页)-原创力文档...
  8. 【过关斩将般的一步步实现】windows本机通过xftp/xshell连接Ubuntu虚拟机服务器
  9. 火狐浏览器播放插件Linux,Firefox浏览器带flash播放器插件
  10. 最短Hamilton路径(哈密顿图,状压dp)
  11. EXCEL之REPT(),让数据更直观!
  12. 关于微信小程序picker之multiSelector多列选择器
  13. 哪个软件能准确测试人脸,人脸识别软件哪个好?人脸识别软件推荐2020
  14. 安卓 调用QQ加群代码
  15. GPIO 按键及矩阵键盘程序------/* 自己实验确认并总结 */
  16. DataTable列自定义渲染切页无效重绘
  17. asp mysql 查询_ASP基础教程:数据库查询语言(1)
  18. 计算机辅助设计的技术论文,【计算机病毒论文】谈计算机辅助设计课程微课化教学(共3741字)...
  19. mybatis+shardingJdbc实现数据库读写分离和分库分表
  20. js 计算N年后日期

热门文章

  1. cloudstack 安全组
  2. 《Spring》第六篇 Bean的生命周期 - 销毁
  3. 生成上千种字体的签名图标
  4. 学会这几招,让你的项目顺利通过验收
  5. 第一次认真入门一场ctf比赛
  6. UE4 3D指南针功能实现
  7. Nvidia jetson nano 配置 CUDA9 CUDNN7.1.5
  8. ubuntu20.04安装多版本的cuda9.0 cuda10.0
  9. html(二):python打开html文件并读取内容,发送至浏览器,浏览器展示结果
  10. Vertx之Junit单元测试