iOS中使用第三方键盘UIKeyboardWillShowNotification执行多次

大家都知道监听键盘的四个通知UIKeyboardWillShowNotification、UIKeyboardDidShowNotification、UIKeyboardWillHideNotification、UIKeyboardDidHideNotification,分别为键盘将要弹出的通知,键盘已经弹出的通知,键盘将要隐藏的通知和键盘已经隐藏的通知。当你对输入框尤其是输入框的.origin.y不固定时,这个时候为了使用户获得更佳的体验便需要开发者处理在键盘弹起后如何将编辑的输入框顶到合适的位置。

一般来说,就我的思路而言,肯定是监听UIKeyboardWillShowNotification通知,然后拿到键盘中保留的一些属性,比如UIKeyboardAnimationCurveUserInfoKey动画类型、UIKeyboardAnimationDurationUserInfoKey动画执行时间、UIKeyboardBoundsUserInfoKey键盘的大小、UIKeyboardFrameBeginUserInfoKey键盘的开始点、UIKeyboardFrameEndUserInfoKey键盘的结束点。然后就根据所得到的动画类型以及时间高度等一系列属性将输入框采用动画模式给它推上去。但是,在处理这个问题的时候,却发现对于原生键盘并不会出现问题,当键盘弹起的时候UIKeyboardWillShowNotification通知只会发出一次,然后处理就可以了,但是对于搜狗,百度输入法这样的第三方,当键盘出现时会发出三次通知,将数据分别打印开来发现并不是每条数据都是键盘弹出的最终结果,所以说如果你三次通知全部做处理,那么当键盘弹起时你输入框弹起的姿势就格外别扭,但是我目前也没有找到判断输入源是否是第三方的判断方法,于是乎。只能从别的地方下手,经过测试看数据,发现有个规律,于是根据规律汇总了一个判断方法,不是很好,但是能用

CGRect begin = [[[note userInfo] objectForKey:@"UIKeyboardFrameBeginUserInfoKey"] CGRectValue];

CGRect end = [[[note userInfo] objectForKey:@"UIKeyboardFrameEndUserInfoKey"] CGRectValue];

//因为第三方键盘或者是在键盘加个toolbar会导致回调三次,这个判断用来判断是否是第三次回调,原生只有一次

if(begin.size.height>0 && (begin.origin.y-end.origin.y>0)){

//处理逻辑

}

以上方法是对于第三方键盘采取的判断方法,如果是对于带有自定义view的键盘,就像textField或者textView中inputAccessoryView不是空,那么键盘也会发出三次通知,一般来说自定义的view高度在苹果UI设计上以44为高度的居多,那么在此讲view的高度设置为44,所以以上判断方法就变为

CGRect begin = [[[note userInfo] objectForKey:@"UIKeyboardFrameBeginUserInfoKey"] CGRectValue];

CGRect end = [[[note userInfo] objectForKey:@"UIKeyboardFrameEndUserInfoKey"] CGRectValue];

//因为第三方键盘或者是在键盘加个toolbar会导致回调三次,这个判断用来判断是否是第三次回调,原生只有一次

if(begin.size.height>44){

//处理逻辑

}

话说上面的方法并不是非常好,暂时可以解决问题,后续会一直关注这个问题,找出更好地办法,如大神们有更好的方法,不吝赐教。

本人项目中的处理方法:

#pragma mark - 键盘通知的方法

-(void)keyBoardWillShow:(NSNotification *)notification{

NSLog(@"%s",__func__);

NSDictionary *keyBordInfo = [notification userInfo];

NSValue *value = [keyBordInfo objectForKey:UIKeyboardFrameEndUserInfoKey];

NSLog(@"keyBordInfo = %@",keyBordInfo);

CGRect keyBoardRect = [value CGRectValue];

float height = keyBoardRect.size.height;

CGRect beginRect = [[keyBordInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];

CGRect endRect = [[keyBordInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

//如果是3.5寸或者4.0寸输入手机号和密码键盘会遮盖登录按钮这里做下处理

if (IPHONESCREEN3p5 || IPHONESCREEN4) {

// 第三方键盘回调三次问题,监听仅执行最后一次

if(beginRect.size.height > 0 && (beginRect.origin.y - endRect.origin.y > 0)){

[UIView animateWithDuration:0.25 animations:^{

self.view.y = self.view.height - CGRectGetMinY(self.loginBtn.frame) - height + 10;

}];

}

}

}



文/RunningMan_Fly(简书作者)
原文链接:http://www.jianshu.com/p/2ad0bbeb674b
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值