iOS限制輸入表情(emoji)矢腻,出現(xiàn)九宮格不能輸入的解決方法?(文章純屬轉載门驾,看著不錯,解決了我的問題多柑,分享給大家)

iOS限制輸入表情(emoji)奶是,出現(xiàn)九宮格不能輸入的解決方法 (文章純屬轉載,看著不錯竣灌,解決了我的問題聂沙,分享給大家)

在提交數(shù)據(jù)發(fā)送網(wǎng)絡請求,由于用戶輸入了emoji表情初嘹,服務端返回系統(tǒng)異常及汉,體驗感很差。為了解決服務器不能驗證emoji編碼的問題屯烦,需要在本地進行emoji的輸入控制(一般情況應該由服務器在數(shù)據(jù)庫中添加emoji對應的轉碼表以支持客戶端發(fā)送emoji表情)坷随。

所以就有了這個需求:在TextField或者TextView中,限制輸入任何表情符號驻龟,(包括系統(tǒng)自帶的表情温眉,第三方鍵盤帶的表情,還有某些漢字類型的表情)翁狐。

利用下面這個方法stringContainsEmoji可以限制系統(tǒng)鍵盤自帶的表情

/**

*? 判斷字符串中是否存在emoji

* @param string 字符串

* @return YES(含有表情)

*/

- (BOOL)stringContainsEmoji:(NSString *)string {

? ? __block BOOL returnValue = NO;

? ? [string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:

? ? ^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {

? ? ? ? const unichar hs = [substring characterAtIndex:0];

? ? ? ? // surrogate pair

? ? ? ? if (0xd800 <= hs && hs <= 0xdbff) {

? ? ? ? ? ? if (substring.length > 1) {

? ? ? ? ? ? ? ? const unichar ls = [substring characterAtIndex:1];

? ? ? ? ? ? ? ? const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;

? ? ? ? ? ? ? ? if (0x1d000 <= uc && uc <= 0x1f77f) {

? ? ? ? ? ? ? ? ? ? returnValue = YES;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? } else if (substring.length > 1) {

? ? ? ? ? ? const unichar ls = [substring characterAtIndex:1];

? ? ? ? ? ? if (ls == 0x20e3) {

? ? ? ? ? ? ? ? returnValue = YES;

? ? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? ? // non surrogate

? ? ? ? ? ? if (0x2100 <= hs && hs <= 0x27ff) {

? ? ? ? ? ? ? ? returnValue = YES;

? ? ? ? ? ? } else if (0x2B05 <= hs && hs <= 0x2b07) {

? ? ? ? ? ? ? ? returnValue = YES;

? ? ? ? ? ? } else if (0x2934 <= hs && hs <= 0x2935) {

? ? ? ? ? ? ? ? returnValue = YES;

? ? ? ? ? ? } else if (0x3297 <= hs && hs <= 0x3299) {

? ? ? ? ? ? ? ? returnValue = YES;

? ? ? ? ? ? } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {

? ? ? ? ? ? ? ? returnValue = YES;

? ? ? ? ? ? }

? ? ? ? }

? ? }];

? ? return returnValue;

}

利用下面這個方法hasEmoji可以限制第三方鍵盤(常用的是搜狗鍵盤)的表情

/**

*? 判斷字符串中是否存在emoji

* @param string 字符串

* @return YES(含有表情)

*/

- (BOOL)hasEmoji:(NSString*)string;

{

? ? NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]";

? ? NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];

? ? BOOL isMatch = [pred evaluateWithObject:string];

? ? return isMatch;

}

上面這2個方法就可以完全限制住鍵盤輸入所有的表情类溢。但是今天突然發(fā)現(xiàn)系統(tǒng)自帶的鍵盤九宮格輸入漢字不能使用了。

最終發(fā)現(xiàn)當使用九宮格輸入漢字時候露懒,九宮格輸入的本身就是表情闯冷,九宮格對應的是下面????????的字符。所有用上面2個方法就把這些表情限制了隐锭,導致不能輸入漢字窃躲。

既然找到了問題所在,那么開始擼代碼:

利用下面這個方法isNineKeyBoard可以判斷當前是不是在使用九宮格輸入

/**

判斷是不是九宮格

@param string? 輸入的字符

@return YES(是九宮格拼音鍵盤)

*/

-(BOOL)isNineKeyBoard:(NSString *)string

{

? ? NSString *other = @"????????";

? ? int len = (int)string.length;

? ? for(int i=0;i

? ? {

? ? ? ? if(!([other rangeOfString:string].location != NSNotFound))

? ? ? ? ? ? return NO;

? ? }

? ? return YES;

}

下面就是現(xiàn)在UITextView禁止輸入表情的重要代碼钦睡,記得遵守代理~

#pragma mark -------UITextViewDelegate

-(BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

{

? ? if ([textView isFirstResponder]) {

? ? ? ? if ([[[textView textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textView textInputMode] primaryLanguage]) {

? ? ? ? ? ? return NO;

? ? ? ? }

? ? ? ? //判斷鍵盤是不是九宮格鍵盤

? ? ? ? if ([self isNineKeyBoard:text] ){

? ? ? ? ? ? ? ? return YES;

? ? ? ? }else{

? ? ? ? ? ? if ([self hasEmoji:text] || [GeneralMethods stringContainsEmoji:text]){

? ? ? ? ? ? ? ? return NO;

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? return YES;

}

UITextField在下面這個方法中寫就行

#pragma mark -----UITextFieldDelegate

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

}

另外附上幾個有用的方法:

//-----過濾字符串中的emoji

- (NSString *)disable_emoji:(NSString *)text {

? ? NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]"options:NSRegularExpressionCaseInsensitive error:nil];

? ? NSString *modifiedString = [regex stringByReplacingMatchesInString:text

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? options:0

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? range:NSMakeRange(0, [text length])

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? withTemplate:@""];

? ? return modifiedString;

}

/**

* 判斷 字母蒂窒、數(shù)字、中文

*/

- (BOOL)isInputRuleAndNumber:(NSString *)str

{

? ? NSString *other = @"????????";? ? //九宮格的輸入值

? ? unsigned long len=str.length;

? ? for(int i=0;i

? ? {

? ? ? ? unichar a=[str characterAtIndex:i];

? ? ? ? if(!((isalpha(a))

? ? ? ? ? ? ||(isalnum(a))

//? ? ? ? ? ? ||((a=='_') || (a == '-')) //判斷是否允許下劃線荞怒,昵稱可能會用上

? ? ? ? ? ? ||((a==' '))? ? ? ? ? ? ? ? //判斷是否允許空格

? ? ? ? ? ? ||((a >= 0x4e00 && a <= 0x9fa6))

? ? ? ? ? ? ||([other rangeOfString:str].location != NSNotFound)

? ? ? ? ? ? ))

? ? ? ? ? ? return NO;

? ? }

? ? return YES;

}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洒琢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子褐桌,更是在濱河造成了極大的恐慌屈尼,老刑警劉巖阱持,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揽趾,死亡現(xiàn)場離奇詭異,居然都是意外死亡砾淌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門谭网,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汪厨,“玉大人,你說我怎么就攤上這事愉择〗俾遥” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵锥涕,是天一觀的道長衷戈。 經(jīng)常有香客問我,道長层坠,這世上最難降的妖魔是什么殖妇? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮窿春,結果婚禮上拉一,老公的妹妹穿的比我還像新娘。我一直安慰自己旧乞,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布磅氨。 她就那樣靜靜地躺著尺栖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烦租。 梳的紋絲不亂的頭發(fā)上延赌,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音叉橱,去河邊找鬼挫以。 笑死,一個胖子當著我的面吹牛窃祝,可吹牛的內(nèi)容都是我干的掐松。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼粪小,長吁一口氣:“原來是場噩夢啊……” “哼大磺!你這毒婦竟也來了?” 一聲冷哼從身側響起探膊,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杠愧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逞壁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體流济,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡锐锣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绳瘟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刺下。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稽荧,靈堂內(nèi)的尸體忽然破棺而出橘茉,到底是詐尸還是另有隱情,我是刑警寧澤姨丈,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布畅卓,位于F島的核電站,受9級特大地震影響蟋恬,放射性物質發(fā)生泄漏翁潘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一歼争、第九天 我趴在偏房一處隱蔽的房頂上張望拜马。 院中可真熱鬧,春花似錦沐绒、人聲如沸俩莽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扮超。三九已至,卻和暖如春蹋肮,著一層夾襖步出監(jiān)牢的瞬間出刷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工坯辩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馁龟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓漆魔,卻偏偏與公主長得像坷檩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子有送,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容