简单完美的解决键盘遮挡输入框的问题
2016-02-14 22:14
477 查看
开发时页面中会有很多输入框,不可避免的会有键盘弹出时挡住输入框的情况(还有iPhone尺寸,键盘的高度不一致等原因)。 一般做法是监听键盘弹出和隐藏的通知,弹出时让view上移一部分(键盘的高度),隐藏时view下移一部分。
还有做法就是在textField的代理方法中上移view和下移view,在- (void)textFieldDidBeginEditing:(UITextField *)textField中上移view,在- (void)textFieldDidEndEditing:(UITextField *)textField中下移view。 但是,这两种做法都不能完美解决我们标题的问题。 我的做法是将上面两种方法结合,通过通知获得键盘的高度,通过textField的代理方法我们能知道是哪一个textField,然后将这个textField的frame转化到控制器的view的frame,这样我们就可以比较适否被遮挡,遮挡的话进行上移等等。
解决方法:创建一个控制器,作为其他控制器的基类,这样其他控制器中的输入框只要设置了delegate是self就不用写多余代码。
#import "YTUIViewController.h" #import "Define.h" @interface YTUIViewController () { CGFloat viewBottom; //textField的底部 CGFloat keyboardDuration; //键盘隐藏需要的时间 = 键盘弹出的时间 } @end @implementation YTUIViewController //移除监听 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self setupForKeyBoard]; } #pragma mark -键盘相关 //键盘的准备 - (void)setupForKeyBoard { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; //点击手势点击非输入框区域隐藏键盘 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(keyBoardHideAction)]; NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //键盘显示后添加手势 [nc addObserverForName:UIKeyboardWillShowNotification object:nil queue:mainQueue usingBlock:^(NSNotification * _Nonnull note) { [self.view addGestureRecognizer:tap]; [self keyboardWillShow:note]; }]; //键盘消失后移除手势 [nc addObserverForName:UIKeyboardWillHideNotification object:nil queue:mainQueue usingBlock:^(NSNotification * _Nonnull note) { [self.view removeGestureRecognizer:tap]; //键盘动画时间 double duration = [[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; [UIView animateWithDuration:duration animations:^{ self.view.frame = CGRectMake(0, 0 , SCREEN_WIDTH, SCREEN_HEIGHT); }]; }]; } //键盘消失后view下移 - (void)keyBoardHideAction { NSLog(@"begin hide"); [self.view endEditing:YES]; } //通过note获取键盘高度,键盘动画时间 - (void)keyboardWillShow:(NSNotification *)note { NSLog(@"后调用"); //键盘高度 CGFloat keyboardH = [[note.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height; //键盘动画时间 keyboardDuration = [[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; if (viewBottom + keyboardH < SCREEN_HEIGHT) { return; } else { [UIView animateWithDuration:keyboardDuration animations:^{ self.view.frame = CGRectMake(0, - ( keyboardH - (SCREEN_HEIGHT - viewBottom)), SCREEN_WIDTH, SCREEN_HEIGHT); }]; } } #pragma mark -UITextFieldDelegate - (void)textFieldDidBeginEditing:(UITextField *)textField { NSLog(@"最先调用"); //将textField的rect转换到self.view上 CGRect rect = [textField.superview convertRect:textField.frame toView:self.view]; //textField的底部 viewBottom = rect.origin.y + rect.size.height; } - (void)textFieldDidEndEditing:(UITextField *)textField { 4000 NSLog(@"最后调用"); [UIView animateWithDuration:keyboardDuration animations:^{ self.view.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); }]; }
注意:.h文件如下,遵循协议申明在.h文件,这样子类不用再申明遵循该协议
#import <UIKit/UIKit.h> @interface YTUIViewController : UIViewController<UITextFieldDelegate> @end
附上demo地址:[KeyboardDemo](https://git.oschina.net/yant/KeyboardDemo) 如有不对,请指正。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- 绝大部分 Android 手电筒应用需要大量权限
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 这些看似合法的 iPhone Lightning 数据线将劫持您的电脑
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 在 Linux 下交换 Ctrl 与大写锁定键
- 我的iPhone桌面
- Firefox2中输入框丢失光标bug的解决方法
- CS 1.5 键盘基本操作快捷键
- C#控制键盘按键的常用方法
- 很可爱的输入框
- js限制输入框可输入字节数代码
- C#检查键盘大小写锁定状态的方法