每一个iOS应用的开发者在工作中都会遇到需要用户键盘输入数据的需求,而输入框(UITextField/UITextView)的父界面可能是普通的UIView,也可能是UIScrollView,UITableView,UICollectionView 等。而如果输入框位于屏幕的底部,弹起的键盘很可能覆盖输入框,导致用户就看不到输入结果,体验较差。
IQKeyboardManager 为此应运而生,使用IQKeyboardManager可以很容易地解决弹起键盘遮盖输入框的问题,并且易于集成,不需要侵入性地继承特定的类,也不需要实现某些奇怪的协议,满足大部分需求只需要少于5行代码。更让人惊喜的是IQKeyboardManager已经提供Swift版本。
GitHub地址:https://github.com/hackiftekhar/IQKeyboardManager
简单总结一下IQKeyboardManager最重要的功能有以下几点:
1.当键盘遮挡输入文本框的时候,自动上移View,使被遮挡的部分自动处于键盘的上方。
导入IQKeyboardManager后,默认所有的页面都有了这个功能,如果你在哪一个界面不想有这个效果可以在当前界面控制器的生命周期方法中进行设置:
#import <IQKeyboardManager.h>
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[IQKeyboardManager sharedManager].enable = NO;
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[IQKeyboardManager sharedManager].enable = YES;
}
或者在 AppDelegate中注册方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[IQKeyboardManager sharedManager] disableInViewControllerClass:[ViewController class]];
return YES;
}
2.在键盘上会自动添加一个工具条,工具条上有左箭头和右箭头用来切换的输入文本框,还有完成按钮用来收回键盘。
你也可以不使用这个自动工具条,设置的代码如下:
[IQKeyboardManager sharedManager].enableAutoToolbar = NO;
可以隐藏placeholder的颜色
[IQKeyboardManager sharedManager].shouldShowTextFieldPlaceholder = NO;
3.可以将键盘上的return按键,变为Next/Done按键,默认最后一个UITextField/UITextView的键盘return键变为Done。顺序是按照创建控件的先后顺序,而不是从上到下的摆放顺序。
设置的代码如下:
#import <IQKeyboardReturnKeyHandler.h>
@implementation ViewController
{
IQKeyboardReturnKeyHandler *returnKeyHandler;
}
- (void)viewDidLoad
{
[super viewDidLoad];
returnKeyHandler = [[IQKeyboardReturnKeyHandler alloc] initWithViewController:self];
}
4.设置点击背景收回键盘(默认如此)。
- (void)viewDidLoad {
[super viewDidLoad];
[IQKeyboardManager sharedManager].shouldResignOnTouchOutside = YES;
}
5.如果你的视图有导航栏,你不想上移View时,UINavigationBar消失,如上图所示,你也可以进行相应设置:
(1)如果你使用的是storyboard or xib,只需将当前视图视图控制器中的UIView class变为UIScrollView。
(2)如果你使用的是代码,你就需要覆盖UIViewController中的'-(void)loadView' 方法:
-(void)loadView
{
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.view = scrollView;
}