最近项目中遇到了键盘处理通知被调用多次的情况,废了好半天时间才找到解决办法,今天就给小伙伴儿们唠唠第三方键盘处理的那些坑!
详情请看:“https://github.com/boai/BAKeyboardDemo”!
<强> 1,聊天评论框的封装强>
先聊聊我项目中遇到的奇葩情况吧,一个直播界面,上面播放器、下面是分段控制器5个按钮,5个界面,其中三个界面最下面都是评论框,所以就封装了一个评论框公用。
但是本来用的“IQKeyboardManager”,开源键盘处理框架,可是在同一个界面有多个评论框就出现问题了。
<强> 2,先看看“IQKeyboardManager”的使用吧:强>
#进口“AppDelegate.h” AppDelegate中添加这段代码,就可以全局不用管键盘的弹起收回了! # pragma马克-键盘处理 - (void) completionHandleIQKeyboard { IQKeyboardManager *经理=[IQKeyboardManager sharedManager]; 经理。使=是的; 经理。shouldResignOnTouchOutside=是的; 经理。shouldToolbarUsesTextFieldTintColor=是的; 经理。enableAutoToolbar=是的; } >之前<强> 3,具体解决办法强>
但是我项目中得复杂情况就不行了,键盘弹起异常,收回也异常,尤其是用了聊天室这种视图,处理的更麻烦,不要急,看看博爱这些年踩过的坑吧:
先看看键盘处理事件吧:
- 1,首先注册通知: - (void) registNotification { [[NSNotificationCenter defaultCenter] addObserver:自我选择器:@ selector (keyboardWasShown:)名称:UIKeyboardWillShowNotification对象:nil); [[NSNotificationCenter defaultCenter] addObserver:自我选择器:@ selector (keyboardWasHidden:)名称:UIKeyboardWillHideNotification对象:nil); } - 2,再把后路想好:移除通知 - (void) removeNotification { [[NSNotificationCenter defaultCenter] removeObserver:自我); } - 3,通知事件处理:/* !键盘显示要做什么*/- (void) keyboardWasShown: (NSNotification *)通知 { NSDictionary *信息=(通知用户信息); 双时间=[UIKeyboardAnimationDurationUserInfoKey] doubleValue][信息; CGFloat curkeyBoardHeight=[[信息objectForKey: @ " UIKeyboardBoundsUserInfoKey "] CGRectValue] .size.height; CGRect中开始=[[信息objectForKey: @ " UIKeyboardFrameBeginUserInfoKey "] CGRectValue); CGRect中结束=[[信息objectForKey: @ " UIKeyboardFrameEndUserInfoKey "] CGRectValue); CGFloat keyBoardHeight;/* !第三方键盘回调三次问题,监听仅执行最后一次*/如果(begin.size。高度比;0,,(begin.origin。y - end.origin。y比;0)) { keyBoardHeight=curkeyBoardHeight; [UIView animateWithDuration:持续时间动画:^ { CGRect中viewFrame=[自我getCurrentViewController] .view.frame; viewFrame.origin。y -=keyBoardHeight; (自我getCurrentViewController) .view.frame=viewFrame; }); } } - (void) keyboardWasHidden: (NSNotification *)通知 { NSDictionary *信息=(通知用户信息); 双时间=[UIKeyboardAnimationDurationUserInfoKey] doubleValue][信息; [UIView animateWithDuration:持续时间动画:^ { CGRect中viewFrame=[自我getCurrentViewController] .view.frame; viewFrame.origin。y=0; (自我getCurrentViewController) .view.frame=viewFrame; }); }/* ! *获取当前视图的VC * * @return获取当前视图的VC */(*)ui getCurrentViewController { (UIView *视图=自我;视图;视图=view.superview) { UIResponder * nextResponder=[视图nextResponder]; 如果([nextResponder isKindOfClass: [ui类]]) { 返回(ui) nextResponder; } } 返回nil; } >之前具体情况是这样的,在测试过程中,其他界面的评论框都没问题,就直播这个VC有问题,就一步步往下找,后来发现:iOS的第三方键盘会在【- (void) keyboardWasShown: (NSNotification *)通知】这个方法中来回调用多次,不止三次好像,然后就想到一个办法,
/* !第三方键盘回调三次问题,监听仅执行最后一次*/如果(begin.size。高度比;0,,(begin.origin。y - end.origin。y比;0)) { keyBoardHeight=curkeyBoardHeight; [UIView animateWithDuration:持续时间动画:^ { CGRect中viewFrame=[自我getCurrentViewController] .view.frame; viewFrame.origin。y -=keyBoardHeight; (自我getCurrentViewController) .view.frame=viewFrame; }); }iOS开发第三方键盘处理实例代码