關(guān)于iOS自帶九宮格拼音鍵盤和Emoji表情之間的一些坑
發(fā)現(xiàn)問題
最近產(chǎn)品提了一個需求:要求某個“輸入框”禁止輸入 Emoji 表情,我們能想到的方案是:在 UITextField 的 textField:shouldChangeCharactersInRange:replacementString: 代理方法中判斷即將輸入的字符串是否包含 Emoji 表情,如果包含,就在該方法中返回 NO,不允許輸入。
關(guān)于如何判斷一字符串是否包含 Emoji 表情的方法,網(wǎng)上已經(jīng)有很多代碼片段,一般是通過 Unicode 編碼范圍來判斷 ,詳見這里:https://gist.github.com/cihancimen/4146056 ,方法名記為:
- (BOOL)stringContainsEmoji:(NSString *)string;
按照上述思路開發(fā)完后,Emoji 表情確實(shí)是被限制住無法輸入了,但是當(dāng)把鍵盤切換為 iOS 系統(tǒng)自帶的九宮格拼音鍵盤準(zhǔn)備輸入漢字時(shí),卻發(fā)現(xiàn)拼音無法輸入。這是怎么回事?
解決過程
首先通過觀察系統(tǒng)自帶拼音鍵盤的行為,可以發(fā)現(xiàn),當(dāng)通過拼音來輸入漢字時(shí),系統(tǒng)會先在輸入框中“預(yù)輸入”拼音字母作為占位,等用戶在鍵盤上選中漢字時(shí),輸入框中的占位“拼音字母”就會被替換為所對應(yīng)的漢字,如下圖:

通過斷點(diǎn)調(diào)試我們還發(fā)現(xiàn),在輸入拼音過程中,以“知識小集”(zhishixiaoji)為例,當(dāng)我們通過點(diǎn)擊第 9 個鍵來輸入字母 z 時(shí),在 UITextField 的代理方法中獲取到的即將輸入的字符不是 z ,而是一個符號 ➒ ,而輸入結(jié)束后(textFieldDidChange:)該符號 ➒ 就會被替換為所對應(yīng)的字母,然后當(dāng)點(diǎn)擊第 4 個鍵來輸入字母 h 時(shí),同樣地得到即將輸入的字符為 ➍ ,然后再被替換為 h,以此類推…
我們猜測,蘋果之所以這么做是因?yàn)椋瑢τ诰艑m格拼音鍵盤,一個鍵代表著 3 或 4 個字母,當(dāng)你點(diǎn)擊一個鍵時(shí),它并不知道你要輸入那個字母,所以用一個帶圓圈的數(shù)字符號作為臨時(shí)占位,等輸入結(jié)束時(shí)才替換為相應(yīng)的字母。
在九宮格拼音鍵盤中,”ABC” 鍵 ~ “WXYZ” 鍵所對應(yīng)的臨時(shí)占位符號分別為 ➋➌ … ➒ ,表情 “^-^” 鍵所對應(yīng)的為符號 ☻ ,而這些符號在 stringContainsEmoji: 方法中剛好都被判為是 Emoji,所以當(dāng)輸入框禁止輸入 Emoji 表情時(shí),就會導(dǎo)致拼音也無法輸入。
解決方案
就是在 Emoji 判定方法中,過濾掉上述符號(對應(yīng)的 Unicode 編碼為 U+278b ~ U+2792 和 U+263b),如下:

但我們發(fā)現(xiàn)系統(tǒng)自帶的“全鍵盤拼音輸入”不會有上述問題,因?yàn)槊總€鍵都只代表一個字母:

而且,國內(nèi)常用的第三方輸入法也不會有這個問題,因?yàn)樗鼈儾粫谳斎肟蛑小邦A(yù)輸入”拼音字符(而是把拼音顯示在鍵盤上方),只有等用戶選中漢字時(shí),才把漢字填寫到輸入框中,如下(搜狗輸入法):

總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
iOS開發(fā)教程之Status Bar狀態(tài)欄設(shè)置的方法匯總
iOS 的 Status Bar 狀態(tài)欄是一個比較坑的地方,所以下面這篇文章主要給大家介紹了關(guān)于iOS開發(fā)教程之Status Bar狀態(tài)欄設(shè)置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-08-08
iOS 將系統(tǒng)自帶的button改裝成上圖片下文字的樣子
這篇文章主要介紹了 iOS 將系統(tǒng)自帶的button改裝成上圖片下文字的樣子,代碼是通過繼承UIButton,然后再重寫layoutSubviews方法,對自帶的圖片和titleLabel進(jìn)行重新的layout。下面通過本文給大家分享下實(shí)現(xiàn)代碼2016-12-12
ios UITableView 自定義右滑刪除的實(shí)現(xiàn)代碼
這篇文章主要介紹了ios UITableView 自定義右滑刪除的實(shí)現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
Objective-C中字符串NSString的常用操作方法總結(jié)
這篇文章主要介紹了Objective-C中字符串NSString的常用操作方法總結(jié),Objective-C中NSString和NSMutableString這兩個類下包含了操作字符串的大多數(shù)方法,需要的朋友可以參考下2016-04-04
iOS用UITextField切換明文/密文顯示時(shí)末尾空白的問題解決
最近在工作中遇到一個問題,利用UITextField切換明文/密文顯示時(shí)發(fā)現(xiàn)字符串后面會出現(xiàn)一段空白,所以下面這篇文章主要給大家介紹了iOS用UITextField切換明文/密文顯示時(shí)末尾空白問題的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-05-05
iOS通過UIDocumentInteractionController實(shí)現(xiàn)應(yīng)用間傳文件
這篇文章主要為大家介紹了iOS通過UIDocumentInteractionController實(shí)現(xiàn)應(yīng)用間傳文件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

