1、简介
IQKeyboardManager
是一个自动解决键盘遮挡输入源的库,输入源目前只有 UITextView
和 UITextField
;解决方法是让界面内容上移到合适位置让输入框在键盘之上。
2、简单应用
(1)启用IQKeyboardManager
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//默认为YES
[[IQKeyboardManager sharedManager] setEnable:YES];
[[IQKeyboardManager sharedManager] setEnableAutoToolbar:YES];
return YES;
}
(2)键盘弹出时,点击背景,键盘收回
[IQKeyboardManager sharedManager].shouldResignOnTouchOutside = YES;
(3)在某个控制器禁用 IQKeyboardManager
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[IQKeyboardManager sharedManager] setEnable:NO];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[IQKeyboardManager sharedManager] setEnable:YES];
}
(4)键盘 Return
键的处理
可以将键盘上 Return
键变为 next
键,点击进入下一个输入框,最后一个UITextField/UITextView
的时候变为 Done
,点击收起键盘。
@interface IQKeyboardManagerController (){
IQKeyboardReturnKeyHandler * _returnKeyHander;
}
@end
@implementation IQKeyboardManagerController
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[IQKeyboardManager sharedManager].enable = YES;
_returnKeyHander = [[IQKeyboardReturnKeyHandler alloc] initWithViewController:self];
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[IQKeyboardManager sharedManager].enable = NO;
}
@end
(5)Done
修改为 完成
[IQKeyboardManager sharedManager].toolbarDoneBarButtonItemText = "完成";
或者
[IQKeyboardManager sharedManager].toolbarDoneBarButtonItemImage = [UIImage imageNamed:@"IQKeyboardImage"];
(6)修改Toolbar颜色
[IQKeyboardManager sharedManager].shouldToolbarUsesTextFieldTintColor = NO;
[IQKeyboardManager sharedManager].toolbarTintColor = [UIColor redColor];
(7)设置键盘textField的距离,不能小于零,默认是10.0。<触发条件是textField需要改变y时 >
[IQKeyboardManager sharedManager].keyboardDistanceFromTextField = 10.0f;
(8)设置 toolBar
上的 placeholder
是否显示
如果输入框有 placeholder
的话,那么在 toolbar
中默认会显示出来。不想要的话就设置为 NO
;
@property(nonatomic, assign) BOOL shouldShowTextFieldPlaceholder;
3、源码分析
源码分析:https://www.jianshu.com/p/664efa555f71
-------------------------------------------------------
每一个iOS应用的开发者在工作中都会遇到需要用户键盘输入数据的需求,而输入框(UITextField/UITextView)的父界面可能是普通的UIView,也可能是UIScrollView,UITableView,UICollectionView 等。而如果输入框位于屏幕的底部,弹起的键盘很可能覆盖输入框,导致用户就看不到输入结果,体验较差。
IQKeyboardManager 为此应运而生,使用IQKeyboardManager可以很容易地解决弹起键盘遮盖输入框的问题,并且易于集成,不需要侵入性地继承特定的类,也不需要实现某些奇怪的协议,满足大部分需求只需要少于5行代码。更让人惊喜的是IQKeyboardManager已经提供Swift版本。
IQKeyboardManager 官方例子下载地址
官方效果图
首先下载第三方库源码导入已有项目中(也可以使用CocoaPods), 然后只需要一行代码就可控制自动键盘处理事件在整个项目内是否启用。
// iOS delegate内应用入口
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//关闭设置为NO, 默认值为NO.
[IQKeyboardManager sharedManager].enable = YES;
}
如果产品需要当键盘弹起时,点击背景收起键盘,也是一行代码解决。
[IQKeyboardManager sharedManager].shouldResignOnTouchOutside = YES;
而当产品需要支持内联编辑(Inline Editing), 这就需要隐藏键盘上的工具条(默认打开)
[IQKeyboardManager sharedManager].enableAutoToolbar = NO;
如果当某一个输入框特定不需要键盘上的工具条时,一行代码
textField.inputAccessoryView = [[UIView alloc] init];
如果因为不知名的原因需要在某个页面禁止自动键盘处理事件相应,也很简单。
- (void) viewWillAppear: (BOOL)animated {
//打开键盘事件相应
[IQKeyboardManager sharedManager].enable = NO;
}
- (void) viewWillDisappear: (BOOL)animated {
//关闭键盘事件相应
[IQKeyboardManager sharedManager].enable = YES;
}
另外IQKeyboardManager支持屏幕旋转功能,这对一些应用特别有用。
请注意的是,IQKeyboardManager还有一些未解决的问题列表(点击这里), 如果使用过程发现问题,可以对照参考,免得浪费不必要的时间。
----------------------------------------------------------
在你开发App的过程中,如果遇到上下有多个UITextField或UITextView,你准备输入文字,这个时候弹出的键盘可能将底层的覆盖掉,这样的话,你就不能边输入边检查输入的内容了。当然,你也可以通过其他方式如通知,监测键盘弹出时的高度,从而提升整个视图的高度,达到可以看到底层内容的目的,但是这样就有点复杂了,而使用这个库,你只需要导入就可以了,不需要写多余的代码。效果图见下:
效果图
1、0行代码
2、自动工作
3、没有更多的UIScrollView
4、没有更多的人为工作
5、没有更多的#imports
IQKeyboardManager可以在任何方向的界面上工作,也可以有toolBar。允许你定制键盘距离UITextField或UITextView的距离,在键盘上面的UIToolBar添加前一个/后一个/done按钮,当用户在文本框之间切换时播放声音。
1、如果你使用的是Objective-C
Objective-C下通过CocoaPods导入
2、如果你使用的是Swift
Swift下通过CocoaPods导入
Swift下开启功能
(1)控制自动键盘功能启用与否
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//默认为YES,关闭为NO
[IQKeyboardManager sharedManager].enable = YES;
}
(2)键盘弹出时,点击背景,键盘收回
[IQKeyboardManager sharedManager].shouldResignOnTouchOutside = YES;
(3)隐藏键盘上面的toolBar,默认是开启的
[IQKeyboardManager sharedManager].enableAutoToolbar = NO;
(4)如果某一个文本框确实不需要键盘上面的toolBar
textField.inputAccessoryView = [[UIView alloc] init];
(5)如果某个页面不想让键盘弹出
- (void) viewWillAppear: (BOOL)animated {
//关闭自动键盘功能
[IQKeyboardManager sharedManager].enable = NO;
}
- (void) viewWillDisappear: (BOOL)animated {
//开启自动键盘功能
[IQKeyboardManager sharedManager].enable = YES;
}
附:常见问题处理
附:github地址