一句话设置当前控制器的view跟随键盘起伏,妈妈再也不用担心键盘挡住输入框了...
生活随笔
收集整理的這篇文章主要介紹了
一句话设置当前控制器的view跟随键盘起伏,妈妈再也不用担心键盘挡住输入框了...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
項目中有很多輸入框,有輸入框就會喚出鍵盤,喚出鍵盤就很經常鍵盤擋住輸入框。如何解決這個問題?
這個問題并不難,相信大家都會寫。但是寫多了大家就會發現,項目中這么多頁面有輸入框的,那就意味著很多地方都要寫,而且寫的代碼都差不多。那有沒有方便點的,全局控制控制器的view跟隨鍵盤起伏,或者調用一句代碼就可以搞定的?
針對這個問題,為此我實現了一句話設置當前控制器的view跟隨鍵盤起伏。
代碼不多只有輕量級的兩個類:
看看效果:
實現思路 主要代碼實現:
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跟随键盘起伏,妈妈再也不用担心键盘挡住输入框了...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件工程第三次作业-功能测试
- 下一篇: fail2ban安全设置