IQKeyboardManager使用起来很方便,但是也有很多坑:
一、当一个viewCtrl中禁用IQKeyboardManager上移动的效果时候,这个在登录页面会常用到;
{
BOOL _wasKeyboardManagerEnabled;
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
_wasKeyboardManagerEnabled = [[IQKeyboardManager sharedManager] isEnabled];
[[IQKeyboardManager sharedManager] setEnable:NO];
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[IQKeyboardManager sharedManager] setEnable:_wasKeyboardManagerEnabled];
}
2. 若某个类不需要使用 IQKeyboardManager,可以在这个类中这样设置,也就是说在这个类中彻底禁用IQKeyboardManager。
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
IQKeyboardManager *keyboardManager = [IQKeyboardManager sharedManager];
keyboardManager.enable = NO;
keyboardManager.enableAutoToolbar = NO;
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
IQKeyboardManager *keyboardManager = [IQKeyboardManager sharedManager];
keyboardManager.enable = YES;
keyboardManager.enableAutoToolbar = YES;
}
3.项目中使用Masonry,当一个viewCtrl页面,但是当你的 backView 【底视图】不是 tableView 或者scrollView 时。你的导航栏会随着一起往上跑了。
网上找到方法是
- (void)loadView
{
[super loadView];
self.view = [[UIScrollView alloc] initWithFrame:self.view.bounds];
}
上面这种方法,在没有使用Masonry时候,是可以起作用的,但是在使用Masonry时,导航栏不会向上跑了,但是控件的布局乱了。
这是因为在 IQKeyboardManager 和 Masonry 同时使用时,导航栏上移和make.right
失效的问题引起的。
我也是纠结好久在这块
在经过多次尝试之后你会发现。真正的问题所在是 IQKeyboardManager 和 Masonry 同时使用时,控件放在 scrollView上面。masonry 的 make.right约束就会失效。但是 make.width等等其他约束还是正常的。你可以不使用 make.right约束,用 make.width和 make.left代替约束。
但是我觉得还是用 make.right和 make.left约束组合要好些。不要老是写个 make.width的固定宽度。
解决方法:
1.重写 loadView 方法 。把 self.view 替换成 scrollView。
2.背景容器视图(back)必须设置。而且对 back 约束时 要附带 make.width.mas_equalTo(self.view);【不写导致 textField 布局的 make.right 失效】
3.子控件要直接放在self.view 上。不能放在背景容器视图(back)上面。【放在 back上时会无法点击,无法成为第一响应】
#pragma mark - step 01
-(void)loadView { //不将 self.view 替换成 scrollView 会在点击底部输入框时 导航栏也一起往上跑。
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[scrollView setBackgroundColor:[UIColor grayColor]];
self.view = scrollView;
}
/**
1.重写 loadView 方法 。把 self.view 替换成 scrollView。
2.背景容器视图(back)必须设置。而且对 back 约束时 要附带 make.width.mas_equalTo(self.view);
【不写导致 textField 布局的 make.right 失效】
3.子控件要直接放在self.view 上。不能放在背景容器视图(back)上面。
【放在 back上时会无法点击,无法成为第一响应】
*/
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"我是导航栏";
#pragma mark - step 02
UIView *back = [[UIView alloc] init];
[self.view addSubview:back];
[back mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.view);
make.width.mas_equalTo(self.view);
//此处必填 - 【关键点】 。不写导致 textField 布局的 make.right 失效。
//(但是布局textField 时使用 make.width不受这句话限制。)
}];
UITextField *textView = [[UITextField alloc]initWithFrame:CGRectMake(0, 300, 100, 60)];
textView.backgroundColor = [UIColor redColor];
#pragma mark - step 03
[self.view addSubview:textView];
// [back addSubview:textView];
// textView 放在 back上时会无法点击,无法成为第一响应。
[textView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.view).offset(20);
make.right.equalTo(self.view).offset(-20);
make.top.equalTo(self.view).offset(250);
make.height.equalTo(@30);
}];
}
4. IQKeyBoardManager按钮"Done"改成"完成"
IQUIView+IQKeyboardToolbar.m文件里面,找到这一个,替换成initWIthTitle这个方法
// IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:target action:doneAction];
IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStyleDone target:target action:doneAction];
注意:,要替换2个地方,一个是textfid,一个是textView
5. IQKeyBoardManager中,“完成” 按钮的监听事件
[_textFid addDoneOnKeyboardWithTarget:self action:@selector(btnSearchClick)];
6.如果你不想添加一个特定的自动工具栏在键盘上方,应该添加一个类作为它的工具栏,代码如下:
textField.inputAccessoryView = [[UIView alloc] init];
常用属性介绍
-
sharedManager
:获取类库的单例变量 -
enable
:项目使用不使用 IQKeyboardManager 这个类库,当然,某些页面可以根据需要单独设置 -
shouldResignOnTouchOutside
:点击背景页面时是否收起键盘 -
shouldToolbarUsesTextFieldTintColor
:控制键盘上的工具条文字颜色是否用户自定义,默认为 NO -
toolbarManageBehaviour
:有多个输入框时,可以通过点击Toolbar 上的“前一个” “后一个”按钮来实现移动到不同的输入框 -
enableAutoToolbar
:是否显示键盘上的工具条 -
shouldShowTextFieldPlaceholder
:是否显示占位文字(如果输入框有占位文字,那么在 Toolbar 中默认会显示出来) -
placeholderFont
:占位文字的字体大小 -
keyboardDistanceFromTextField
:输入框距离键盘的距离
用法如下:
IQKeyboardManager *manager = [IQKeyboardManager sharedManager];
//控制整个功能是否启用。
manager.enable = YES;
//控制点击背景是否收起键盘
manager.shouldResignOnTouchOutside = YES;
//控制键盘上的工具条文字颜色是否用户自定义。 注意这个颜色是指textfile的tintcolor
manager.shouldToolbarUsesTextFieldTintColor = YES;
//中间位置是否显示占位文字
manager.shouldShowTextFieldPlaceholder = YES;
//设置占位文字的字体
manager.placeholderFont = [UIFont boldSystemFontOfSize:17];
//控制是否显示键盘上的工具条。
manager.enableAutoToolbar = YES;
//某个类中禁止使用工具条
[[IQKeyboardManager sharedManager]disableToolbarInViewControllerClass:[UIViewController class]];