iOS实现输入框跟随键盘自动上移的实例代码
发布时间 - 2026-01-11 00:39:15 点击率:次场景还原

有些时候在包含输入框的页面中,点击输入框输入会因键盘弹起而遮挡住一部分输入框,影响用户体验。iOS在默认情况下并不会处理这种问题,不过我们可以自己实现键盘弹起输入框自动上移的效果。
实现思路
观察键盘的弹起与收回,当弹起的键盘会遮挡住输入框时,将输入框跟随键盘一并上移合适的距离,当键盘收回时,输入框回到原始状态。
具体方案
1. 注册两个观察者,观察键盘的弹起与收回
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
2. 在上面的keyboardWillShow和keyboardWillHide方法中分别实现输入框的上移和还原
上移
当弹起的键盘遮住了页面上的输入框时,我们应该将输入框移至键盘之上,而键盘没有遮到输入框时,并不需要操作。因此在ios的坐标系下,我们可以分别获取键盘弹起后上端的Y坐标和输入框下端的Y坐标,通过做差可以判断出键盘是否遮住了输入框。上移我们可以采用view的transform属性进行平移变换,而不是直接去操作view的frame,这样做的好处是当我们要还原view的状态时可以直接将transform重置为0,而不需要再关心计算下移时的距离。
还原(下移至原始状态)
根据前面所说,我们只要在恰当的时机操作view的transform属性就可以实现了。
- (void)keyboardWillShow:(NSNotification *)notification
{
//获取处于焦点中的view
NSArray *textFields = @[phoneNemberText, verifyCodeText];
UIView *focusView = nil;
for (UITextField *view in textFields) {
if ([view isFirstResponder]) {
focusView = view;
break;
}
}
if (focusView) {
//获取键盘弹出的时间
double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
//获取键盘上端Y坐标
CGFloat keyboardY = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
//获取输入框下端相对于window的Y坐标
CGRect rect = [focusView convertRect:focusView.bounds toView:[[[UIApplication sharedApplication] delegate] window]];
CGPoint tmp = rect.origin;
CGFloat inputBoxY = tmp.y + focusView.frame.size.height;
//计算二者差值
CGFloat ty = keyboardY - inputBoxY;
NSLog(@"position keyboard: %f, inputbox: %f, ty: %f", keyboardY, inputBoxY, ty);
//差值小于0,做平移变换
[UIView animateWithDuration:duration animations:^{
if (ty < 0) {
self.view.transform = CGAffineTransformMakeTranslation(0, ty);
}
}];
}
}
- (void)keyboardWillHide:(NSNotification *)notification
{
//获取键盘弹出的时间
double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
//还原
[UIView animateWithDuration:duration animations:^{
self.view.transform = CGAffineTransformMakeTranslation(0, 0);
}];
}
看上去这样已经完美实现了输入框随键盘自动上移,我们也可以喝杯茶稍微休息一下了。没错,在iOS 8及之后的系统中,确实可以正常的工作,然而如果你的应用需要适配iOS 7并且要支持横屏,那么上面的方式在iOS7上,并不能按照我们的期望正确移动。
原因:在ios7上,键盘的frame,系统是按照竖屏状态下window坐标系来计算的,并不考虑旋转的因素,因此在横屏下得到的键盘frame是错误的。受此影响的还有横屏时获取屏幕宽高[UIScreen mainScreen].bounds,也会有这样的问题。这种情况我们不仅无法正确得到键盘的frame,而且输入框相对于window的坐标计算结果也是错误的。
因此在ios7上,键盘上端的Y坐标以及输入框下端相对于window的Y坐标需要单独处理。键盘上端的Y坐标可以通过屏幕高度减键盘高度得到。我们通过下面的方法获取键盘上端的Y坐标。
- (CGFloat)getKeyboardY:(NSDictionary *)userInfo
{
CGFloat screenHeight;
CGFloat keyboardY = 0;
CGFloat keyboardHeight = 0;
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (( [[[UIDevice currentDevice] systemVersion] floatValue]<8) && UIInterfaceOrientationIsLandscape(orientation))
{
screenHeight = [[UIScreen mainScreen] bounds].size.width;
keyboardHeight = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size.width;
keyboardY = screenHeight - keyboardHeight;
}
else if (( [[[UIDevice currentDevice] systemVersion] floatValue]<8) && UIInterfaceOrientationIsPortrait(orientation)) {
screenHeight = [[UIScreen mainScreen] bounds].size.height;
keyboardHeight = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
keyboardY = screenHeight - keyboardHeight;
}
else {
keyboardY = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
}
return keyboardY;
}
输入框下端相对于window的坐标如何计算呢?我们首先获得的其实是基于竖屏状态下坐标系中的Y值,而我们期望的是横屏下得到横屏状态下坐标系中的Y值,根据两个坐标系的关系,可以将第一次转换得到的坐标再做一次转换,计算得出横屏坐标系下的Y坐标值。我们通过下面的方法获取输入框下端的Y坐标。
- (CGPoint)getViewOriginPointToWindow:(UIView *)view
{
CGPoint origin;
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8) {
CGPoint focusViewPoint = [view convertPoint:CGPointZero toView:nil];
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (orientation == UIInterfaceOrientationLandscapeLeft) {
origin.y = focusViewPoint.x;
origin.x = [[[UIApplication sharedApplication] delegate] window].bounds.size.height - focusViewPoint.y;
}
else if (orientation == UIInterfaceOrientationLandscapeRight) {
origin.y = [[[UIApplication sharedApplication] delegate] window].bounds.size.width - focusViewPoint.x;
origin.x = focusViewPoint.y;
}
else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
origin.y = [[[UIApplication sharedApplication] delegate] window].bounds.size.height - focusViewPoint.y;
origin.x = [[[UIApplication sharedApplication] delegate] window].bounds.size.width - focusViewPoint.x;
}
else {
origin = focusViewPoint;
}
}
else {
CGRect rect = [view convertRect:view.bounds toView:[[[UIApplication sharedApplication] delegate] window]];
origin = rect.origin;
}
return origin;
}
因此我们将之前获取两个Y坐标的代码改用下面的方式:
//获取键盘上端Y坐标 CGFloat keyboardY = [self getKeyboardY:notification.userInfo]; //获取输入框下端相对于window的Y坐标 CGPoint tmp = [self getViewOriginPointToWindow:focusView]; CGFloat inputBoxY = tmp.y + focusView.frame.size.height;
这样就完美实现了输入框随键盘自动上移的效果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# ios
# 输入框跟随键盘
# 输入框随键盘移动
# ios键盘上添加输入框
# h5 ios输入框和键盘的兼容性优化指南
# iOS项目开发键盘弹出遮挡输入框问题解决方案
# IOS 键盘挡住输入框的问题解决办法
# ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
# iOS键盘弹出遮挡输入框的解决方法
# 输入框
# 相对于
# 我们可以
# 实现了
# 弹出
# 状态下
# 移至
# 遮住了
# 的是
# 会有
# 可以通过
# 这样做
# 可以直接
# 这种情况
# 当我们
# 在上面
# 并不能
# 我们应该
# 休息一下
# 要再
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
公司网站制作需要多少钱,找人做公司网站需要多少钱?
浅谈Javascript中的Label语句
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
Laravel集合Collection怎么用_Laravel集合常用函数详解
如何快速完成中国万网建站详细流程?
Laravel如何配置Horizon来管理队列?(安装和使用)
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
如何在阿里云完成域名注册与建站?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
如何确保FTP站点访问权限与数据传输安全?
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
香港服务器如何优化才能显著提升网站加载速度?
原生JS实现图片轮播切换效果
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
如何快速搭建二级域名独立网站?
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
七夕网站制作视频,七夕大促活动怎么报名?
网页设计与网站制作内容,怎样注册网站?
如何续费美橙建站之星域名及服务?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
教你用AI润色文章,让你的文字表达更专业
网站制作软件免费下载安装,有哪些免费下载的软件网站?
浅谈javascript alert和confirm的美化
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
Swift开发中switch语句值绑定模式
网站制作壁纸教程视频,电脑壁纸网站?
,南京靠谱的征婚网站?
如何生成腾讯云建站专用兑换码?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
jQuery validate插件功能与用法详解
利用python获取某年中每个月的第一天和最后一天
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
如何在景安服务器上快速搭建个人网站?
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
C++用Dijkstra(迪杰斯特拉)算法求最短路径
如何快速生成高效建站系统源代码?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
清除minerd进程的简单方法
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
如何在阿里云服务器自主搭建网站?
南京网站制作费用,南京远驱官方网站?
独立制作一个网站多少钱,建立网站需要花多少钱?
黑客入侵网站服务器的常见手法有哪些?
如何在IIS7上新建站点并设置安全权限?

