欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

一句话设置当前控制器的view跟随键盘起伏,妈妈再也不用担心键盘挡住输入框了...

发布时间:2025/3/8 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 一句话设置当前控制器的view跟随键盘起伏,妈妈再也不用担心键盘挡住输入框了... 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

项目中有很多输入框,有输入框就会唤出键盘,唤出键盘就很经常键盘挡住输入框。如何解决这个问题?

这个问题并不难,相信大家都会写。但是写多了大家就会发现,项目中这么多页面有输入框的,那就意味着很多地方都要写,而且写的代码都差不多。那有没有方便点的,全局控制控制器的view跟随键盘起伏,或者调用一句代码就可以搞定的?

针对这个问题,为此我实现了一句话设置当前控制器的view跟随键盘起伏。

代码不多只有轻量级的两个类:

屏幕快照 2017-09-15 下午7.02.33.png

看看效果:

Untitled2.gif

实现思路 主要代码实现:

1、监听输入框开始编辑,键盘改变的通知

// TextField开始编辑[[NSNotificationCenter defaultCenter] addObserver:instance selector:@selector(textFieldTextDidBeginEditingNotification:) name:UITextFieldTextDidBeginEditingNotificationobject:nil];// TextView开始编辑[[NSNotificationCenter defaultCenter] addObserver:instance selector:@selector(textViewTextDidBeginEditingNotification:) name:UITextViewTextDidBeginEditingNotificationobject:nil];// 键盘将要改变[[NSNotificationCenter defaultCenter] addObserver:instance selector:@selector(keyboardWillChangeFrameNotification:) name:UIKeyboardWillChangeFrameNotification object:nil];复制代码

2、获取当前的控制器,判断键盘是否挡住输入框,然后计算偏移view

/// 偏移View -(void)transformView:(NSNotification *)notification {//获取键盘弹出后的RectNSValue *keyBoardEndBounds=[[notification userInfo]objectForKey:UIKeyboardFrameEndUserInfoKey];CGRect endRect=[keyBoardEndBounds CGRectValue];UIView *targetView;if ([self.inputObject isKindOfClass:[UIView class]]) {targetView = self.inputObject;}if (!targetView) {return;}UIViewController *vc = [self getCurrentVC];// targetView 在 toView 的 convertRect位置上的位置CGRect targetRect = [targetView convertRect:CGRectMake(0, 0, targetView.frame.size.width, targetView.frame.size.height) toView:vc.view];CGFloat height = [UIScreen mainScreen].bounds.size.height;CGFloat maxY = CGRectGetMaxY(targetRect);CGFloat cha = endRect.origin.y - maxY;if (maxY > endRect.origin.y) { // 键盘会挡住输入框if ([vc.view.subviews.firstObject isKindOfClass:[UIScrollView class]]) {// 如果self.view是UIScrollView,则滚动contentOffsetUIScrollView *scrollView= vc.view.subviews.firstObject;//NSLog(@"%@",NSStringFromCGPoint(scrollView.contentOffset));scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y + (-cha) + 10);}else {CGFloat interval = 0;if (cha < -10) {interval = 10;}[UIView animateWithDuration:0.25f animations:^{[vc.view setFrame:CGRectMake(vc.view.frame.origin.x, cha - interval, vc.view.frame.size.width, vc.view.frame.size.height)];}];}}if (endRect.origin.y == height) { //键盘回收 deltaY>100//NSLog(@"键盘回收");if ([vc.view.subviews.firstObject isKindOfClass:[UIScrollView class]]) {//UIScrollView *scrollView= self.view.subviews.firstObject;//NSLog(@"%@",NSStringFromCGPoint(scrollView.contentOffset));}else {[UIView animateWithDuration:0.25f animations:^{[vc.view setFrame:CGRectMake(0, 0, vc.view.frame.size.width, vc.view.frame.size.height)];}];self.inputObject = nil;self.keyboardNotifivation = nil;}} }复制代码

使用方式有两种:

第一种:只导入JHKeyBoardManager.h这个类到项目中,在AppDelegate写一句代码即可

#import "JHKeyBoardManager.h" - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[JHKeyBoardManager sharedManager];return YES; }复制代码

第二种:只导入UIViewController+KeyBoardManager.h这个类到项目中,要用的控制器只需掉用一个方法即可

#import "UIViewController+KeyBoardManager.h" - (void)viewDidLoad {[super viewDidLoad];[self transformViewForKeyboard]; }复制代码

demo地址:github.com/iOSHJH/JHKe…

有问题欢迎issues,若项目对你有用还望不吝给个star让我动力十足?

总结

以上是生活随笔为你收集整理的一句话设置当前控制器的view跟随键盘起伏,妈妈再也不用担心键盘挡住输入框了...的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。