關(guān)于iOS自帶九宮格拼音鍵盤和Emoji表情之間的一些坑
發(fā)現(xiàn)問題
最近產(chǎn)品提了一個(gè)需求:要求某個(gè)“輸入框”禁止輸入 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)會(huì)先在輸入框中“預(yù)輸入”拼音字母作為占位,等用戶在鍵盤上選中漢字時(shí),輸入框中的占位“拼音字母”就會(huì)被替換為所對(duì)應(yīng)的漢字,如下圖:

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

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

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

總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- IOS自定義UIButton九宮格效果
- iOS實(shí)現(xiàn)九宮格自動(dòng)生成視圖
- IOS 九宮格布局實(shí)現(xiàn)方法
- iOS仿郵箱大師的九宮格手勢(shì)密碼解鎖
- 深入解析iOS應(yīng)用開發(fā)中九宮格視圖布局的相關(guān)計(jì)算方法
- 詳解iOS應(yīng)用UI開發(fā)中的九宮格坐標(biāo)計(jì)算與字典轉(zhuǎn)換模型
- 使用Swift代碼實(shí)現(xiàn)iOS手勢(shì)解鎖、指紋解鎖實(shí)例詳解
- iOS實(shí)現(xiàn)手勢(shì)解鎖操作
- iOS實(shí)現(xiàn)九宮格連線手勢(shì)解鎖
相關(guān)文章
iOS中UITableview錯(cuò)位的問題怎么修復(fù)
這篇文章主要介紹了iOS中UITableview錯(cuò)位的問題以及修復(fù)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-01-01
iOS開發(fā)教程之Status Bar狀態(tài)欄設(shè)置的方法匯總
iOS 的 Status Bar 狀態(tài)欄是一個(gè)比較坑的地方,所以下面這篇文章主要給大家介紹了關(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方法,對(duì)自帶的圖片和titleLabel進(jìn)行重新的layout。下面通過本文給大家分享下實(shí)現(xiàn)代碼2016-12-12
ios UITableView 自定義右滑刪除的實(shí)現(xiàn)代碼
這篇文章主要介紹了ios UITableView 自定義右滑刪除的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
Objective-C中字符串NSString的常用操作方法總結(jié)
這篇文章主要介紹了Objective-C中字符串NSString的常用操作方法總結(jié),Objective-C中NSString和NSMutableString這兩個(gè)類下包含了操作字符串的大多數(shù)方法,需要的朋友可以參考下2016-04-04
iOS用UITextField切換明文/密文顯示時(shí)末尾空白的問題解決
最近在工作中遇到一個(gè)問題,利用UITextField切換明文/密文顯示時(shí)發(fā)現(xiàn)字符串后面會(huì)出現(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

