客户有一个需求,唤醒键盘时判断是否登录,若没有登录就进入登录并且收起键盘。
我开始的做法是收到键盘显示通知后隐藏键盘,但是无论调用那种方式的隐藏键盘,键盘都收不起来,估计有可能和IQKeyboardManager有关。
在输入控件实现了tv.delegate = self;
,先看隐藏键盘的方式:
1.注销第一响应者:resignFirstResponder
;
2.结束编辑(你的View必须是继承于UIControl):[self endEditing:YES];
或[self.view endEditing:YES];
;
3.keyWindow结束编辑,可以用来统一收起键盘[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
;
4.直接发送 resignFirstResponder 消息:[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]
;
我的输入框是加在keyWindow上的。试过以上四种方法全部无效。
[_comTool setKeyBoardChangeBlock:^(CGFloat height, CGFloat animationDuration) {if (DYGlobleData.isLogin) {if(animationDuration <= 0){//防范式编程,理论不会出现weakSelf.bgV.hidden = NO;}else{weakSelf.bgV.hidden = (height<=0);[UIView animateWithDuration:animationDuration animations:^{if((height<=0)){[weakSelf.comTool mas_updateConstraints:^(MASConstraintMaker *make) {make.height.mas_equalTo(BaseSize(100));make.width.mas_equalTo(KScreenW);make.bottom.mas_equalTo(BaseSize(100) -(49+(BR_BOTTOM_MARGIN?24:0)));}];[weakSelf.comTool updateCommentTVWithShift:(BaseSize(100) -(49+(BR_BOTTOM_MARGIN?24:0))+(BR_BOTTOM_MARGIN?24:0))];}else{[weakSelf.comTool mas_updateConstraints:^(MASConstraintMaker *make) {make.height.mas_equalTo(BaseSize(100));make.width.mas_equalTo(KScreenW);make.bottom.mas_equalTo(-height);}];[weakSelf.comTool updateCommentTVWithShift:0];}[weakSelf layoutIfNeeded];} completion:^(BOOL finished) {CGFloat keyboardHeight = [weakSelf displayKeyboardDockView];if(keyboardHeight > 0){[weakSelf.comTool mas_updateConstraints:^(MASConstraintMaker *make) {make.height.mas_equalTo(BaseSize(100));make.width.mas_equalTo(KScreenW);make.bottom.mas_equalTo(-keyboardHeight);}];[weakSelf.comTool updateCommentTVWithShift:0];}else{[weakSelf.comTool mas_updateConstraints:^(MASConstraintMaker *make) {make.height.mas_equalTo(BaseSize(100));make.width.mas_equalTo(KScreenW);make.bottom.mas_equalTo(BaseSize(100) -(49+(BR_BOTTOM_MARGIN?24:0)));}];[weakSelf.comTool updateCommentTVWithShift:(BaseSize(100) -(49+(BR_BOTTOM_MARGIN?24:0))+(BR_BOTTOM_MARGIN?24:0))];}[weakSelf layoutIfNeeded];}];}} else {weakSelf.bgV.hidden = YES;[weakSelf.comTool mas_updateConstraints:^(MASConstraintMaker *make) {make.height.mas_equalTo(BaseSize(100));make.width.mas_equalTo(KScreenW);make.bottom.mas_equalTo(BaseSize(100) -(49+(BR_BOTTOM_MARGIN?24:0)));}];[weakSelf.comTool updateCommentTVWithShift:(BaseSize(100) -(49+(BR_BOTTOM_MARGIN?24:0))+(BR_BOTTOM_MARGIN?24:0))];[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
// [weakSelf layoutIfNeeded];[weakSelf.comTool resignFirstResponder];[weakSelf endEditing:YES];if(weakSelf.endEditingBlock){weakSelf.endEditingBlock();}LCAccountLogController *login = [[LCAccountLogController alloc] init];DY_NavViewController *nav = [[DY_NavViewController alloc] initWithRootViewController:login];nav.modalPresentationStyle = 0;[[FMConfig config].window.rootViewController presentViewController:nav animated:YES completion:nil];};}];
既然显示键盘后立即收起不了,那么换一个思路:当判断是否显示键盘时,当发现没有登录时直接返回不显示键盘,并进行后续处理。
输入框所在控件判断是否需要显示键盘:
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{if(self.checkCannotBeginEditingBlock){self.checkCannotBeginEditingBlock();return !self.cannotBeginEditing;}else{return YES;}
}
输入框的父控件进行具体的键盘是否显示判断:
_comTool.checkCannotBeginEditingBlock = ^{if (DYGlobleData.isLogin){weakSelf.comTool.cannotBeginEditing = NO;}else{if(DYGlobleData.isInLogin){return;}weakSelf.bgV.hidden = YES;weakSelf.comTool.cannotBeginEditing = YES;LCAccountLogController *login = [[LCAccountLogController alloc] init];[DYGetCurrentViewController().navigationController pushViewController:login animated:YES];}};