想到很多读者都是来找解决方法的,所以我先把解决方法写出来:
原写法:
<span style="white-space:pre"> </span>[self.textInputTextField resignFirstResponder];
self.textInputTextField.inputView = inputView;
[self.textInputTextField becomeFirstResponder];
解决办法:
<span style="white-space:pre"> </span>self.textInputTextField.inputView = inputView;
[self.textInputTextField reloadInputViews];
结论:
用reloadInputViews去替代resignFirstResponder和becomeFirstResponder两个方法的组合,可以解决切换系统和自定义键盘时产生的卡顿
但是为什么用resignFirstResponder和becomeFirstResponder会卡顿,不懂底层,所以想不到该怎么解释,如果读者有人知道,还请留下您的看法啊!!
--------------------------------------------------------------开始详细的BB叨-------------------------------------------------------------------------
接手外包公司做的第一版项目,IM部分用的10s循环访问服务器获取最新消息.看的我和经理感觉后背发凉.又因为公司其他项目也用到IM,所以我们打算自己写一个(功能很简单的IM).
我们IM的界面和逻辑大致参考微信去做,当然比微信的功能少很多,只是满足简单的交流需求.
表情键盘和语音消息、图片和发小视频这些功能是必不可少的,所以在界面中就需要切换键盘,那么,下面问题就来了
我的实现思路大概就是先"辞去当前TextField的第一响应者"->设置TextField的inputView->"当前TextField成为第一响应者"来展现自定义的View,然后再点击按钮的时候判断按钮的selected状态,"辞去当前TextField的第一响应者"->设置TextField的inputView = nil->"当前TextField成为第一响应者"来切换回系统键盘.代码如下
if (sender.selected == NO) {
[self.textInputTextField resignFirstResponder];
self.textInputTextField.inputView = inputView;
[self.textInputTextField becomeFirstResponder];
sender.selected = YES;
}else{
<pre name="code" class="objc"> [self.textInputTextField resignFirstResponder];
self.textInputTextField.inputView = nil;
[self.textInputTextField becomeFirstResponder];
sender.selected = NO; }
然后在真机上运行,忽然发现卡爆了,大概有0.5秒的卡顿...短短几行简单无比的代码能卡顿这么久,不能忍...于是乎找到底卡顿是哪句代码产生的,于是想到用"
CACurrentMediaTime()",代码如下
<span style="white-space:pre"> </span>NSTimeInterval start = CACurrentMediaTime();
[self.textInputTextField resignFirstResponder];
NSLog(@"%f",CACurrentMediaTime() - start);
start = CACurrentMediaTime();
self.textInputTextField.inputView = inputView;
NSLog(@"%f",CACurrentMediaTime() - start);
start = CACurrentMediaTime();
[self.textInputTextField becomeFirstResponder];
NSLog(@"%f",CACurrentMediaTime() - start);
sender.selected = YES;
发现耗时最多的就是resignFirstResponder和becomeFirstResponder两个方法,但是从打印时间间隔来看,程序启动第一次呼出自定义键盘的时候,整个方法执行下来大概是0.5秒左右,可以理解,毕竟需要初始化view,后续再调用这个方法,整体时间间隔大概就是0.2秒左右.但是卡顿给我的感觉大概得有0.5秒左右.
然后在网上搜"inputView切换卡顿",发现好像没人遇到这个问题啊,难道我人品爆炸了?
无意中发现一位网友用了reloadInputViews这个方法,怀着尝试的心态试一下,我靠,好多了,很开心.但是具体的为什么会那么卡,不懂底层,找不到实质性原因,如有大神看到该贴,还请指教.