關於UITextField切換系統鍵盤和InputView的卡頓的問題
想到很多讀者都是來找解決方法的,所以我先把解決方法寫出來:
原寫法:
<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這個方法,懷著嘗試的心態試一下,我靠,好多了,很開心.但是具體的為什麼會那麼卡,不懂底層,找不到實質性原因,如有大神看到該貼,還請指教.
相關文章
- Android 解決表情皮膚和軟鍵盤切換時跳閃的問題Android
- iOS 切換鍵盤iOS
- 信創雲盤,解決雙系統切換的資料交換同步問題
- Win10系統切換視窗卡頓怎麼辦_win10切換視窗卡頓的解決教程Win10
- 關於PHP的切換版本PHP
- 電腦鍵盤怎麼切換中文 電腦鍵盤切換中英文教程
- 關於系統效能的一個問題
- 求助:關於系統超時的問題
- 在使用“U盤系統盤製作工具”時遇到的問題和有關理解
- 關於線上檢測主執行緒卡頓的問題執行緒
- 請問一個關於web的管理系統的問題Web
- Mac上一鍵切換系統各項功能的工具Mac
- Only Switch,一鍵切換系統各項功能的神器
- 關於生產系統鎖問題的排查
- [求助]關於系統的國際化問題
- Win10系統WASD和箭頭鍵被切換的解決方法Win10
- win10系統怎麼關閉shift鍵切換大小寫Win10
- 快速解決cmd中不同盤之間不能切換的問題
- win10輸入法切換快捷鍵怎麼設定 更改鍵盤切換快捷鍵的方法一覽Win10
- 關於HTTP和HTTPS相互轉換的問題--解決根據過濾器自動切換功能--可用HTTP過濾器
- 平板藍芽鍵盤怎麼切換輸入法 ipad藍芽鍵盤切換中英文藍芽iPad
- win10系統如何關閉虛擬鍵盤 win10系統關閉虛擬鍵盤的方法Win10
- Android 軟鍵盤相關問題Android
- 關於JS的編碼轉換問題JS
- 關於mysql字元和數字型別轉換的問題研究MySql字元型別
- 關於jdon裡許可權系統的問題
- 關於SSH中對於action的監聽問題(關於系統計數)
- 關於前端主題切換的思考和現代前端樣式的解決方案落地前端
- 關於JAVA實用系統開發的指南的問題Java
- 關於時間轉換 SimpleDateFormat 的使用的問題ORM
- 切換Windows的系統語言Windows
- 關於模擬鍵盤的再次思考。
- Win10系統修改輸入法切換快捷鍵的方法Win10
- 關於如何系統提升自己專業能力的問題?
- 關於高效能聊天系統的一個問題
- 基於關鍵詞及問題主題的問題相似度計算
- 救命,關於類轉換問題
- 關於mes系統硬體配置問題