在提交數(shù)據(jù)發(fā)送網(wǎng)絡(luò)請求,由于用戶輸入了emoji表情曙搬,服務(wù)端返回系統(tǒng)異常好港,體驗(yàn)感很差。為了解決服務(wù)器不能驗(yàn)證emoji編碼的問題骨宠,需要在本地進(jìn)行emoji的輸入控制(一般情況應(yīng)該由服務(wù)器在數(shù)據(jù)庫中添加emoji對應(yīng)的轉(zhuǎn)碼表以支持客戶端發(fā)送emoji表情)浮定。
所以就有了這個(gè)需求:在TextField或者TextView中,限制輸入任何表情符號层亿,(包括系統(tǒng)自帶的表情桦卒,第三方鍵盤帶的表情,還有某些漢字類型的表情)匿又。
利用下面這個(gè)方法stringContainsEmoji可以限制系統(tǒng)鍵盤自帶的表情
/**
?*? 判斷字符串中是否存在emoji
?* @param string 字符串
?* @return YES(含有表情)
?*/
+ (BOOL)stringContainsEmoji:(NSString*)string {
? ? __blockBOOLreturnValue =NO;
? ? [stringenumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:
?? ? ^(NSString*substring,NSRangesubstringRange,NSRangeenclosingRange,BOOL*stop) {
?? ? ? ? constunicharhs = [substringcharacterAtIndex:0];
?? ? ? ? // surrogate pair
?? ? ? ? if(0xd800<= hs && hs <=0xdbff) {
?? ? ? ? ? ? if(substring.length>1) {
?? ? ? ? ? ? ? ? constunicharls = [substringcharacterAtIndex:1];
?? ? ? ? ? ? ? ? constintuc = ((hs -0xd800) *0x400) + (ls -0xdc00) +0x10000;
?? ? ? ? ? ? ? ? if(0x1d000<= uc && uc <=0x1f77f) {
?? ? ? ? ? ? ? ? ? ? returnValue =YES;
?? ? ? ? ? ? ? ? }
?? ? ? ? ? ? }
?? ? ? ? }elseif(substring.length>1) {
?? ? ? ? ? ? constunicharls = [substringcharacterAtIndex:1];
?? ? ? ? ? ? if(ls ==0x20e3) {
?? ? ? ? ? ? ? ? returnValue =YES;
?? ? ? ? ? ? }
?? ? ? ? }else{
?? ? ? ? ? ? // non surrogate
?? ? ? ? ? ? if(0x2100<= hs && hs <=0x27ff) {
?? ? ? ? ? ? ? ? returnValue =YES;
?? ? ? ? ? ? }elseif(0x2B05<= hs && hs <=0x2b07) {
?? ? ? ? ? ? ? ? returnValue =YES;
?? ? ? ? ? ? }elseif(0x2934<= hs && hs <=0x2935) {
?? ? ? ? ? ? ? ? returnValue =YES;
?? ? ? ? ? ? }elseif(0x3297<= hs && hs <=0x3299) {
?? ? ? ? ? ? ? ? returnValue =YES;
?? ? ? ? ? ? }elseif(hs ==0xa9|| hs ==0xae|| hs ==0x303d|| hs ==0x3030|| hs ==0x2b55|| hs ==0x2b1c|| hs ==0x2b1b|| hs ==0x2b50) {
?? ? ? ? ? ? ? ? returnValue =YES;
?? ? ? ? ? ? }
?? ? ? ? }
?? ? }];
? ? returnreturnValue;
}
/**
?*? 判斷字符串中是否存在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 = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", pattern];
? ? BOOLisMatch = [predevaluateWithObject:string];
? ? returnisMatch;
}
/**
?判斷是不是九宮格
?@param string? 輸入的字符
?@return YES(是九宮格拼音鍵盤)
?*/
+(BOOL)isNineKeyBoard:(NSString*)string
{
? ? NSString*other =@"????????";
? ? intlen = (int)string.length;
? ? for(inti=0;i
? ? {
? ? ? ? if(!([otherrangeOfString:string].location!=NSNotFound))
? ? ? ? ? ? returnNO;
? ? }
? ? return YES;
}
上面這2個(gè)方法就可以完全限制住鍵盤輸入所有的表情方灾。但是今天突然發(fā)現(xiàn)系統(tǒng)自帶的鍵盤九宮格輸入漢字不能使用了。
最終發(fā)現(xiàn)當(dāng)使用九宮格輸入漢字時(shí)候碌更,九宮格輸入的本身就是表情裕偿,九宮格對應(yīng)的是下面????????的字符洞慎。所有用上面2個(gè)方法就把這些表情限制了,導(dǎo)致不能輸入漢字嘿棘。
既然找到了問題所在拢蛋,那么開始擼代碼:
利用下面這個(gè)方法isNineKeyBoard可以判斷當(dāng)前是不是在使用九宮格輸入
/**
判斷是不是九宮格
@param string? 輸入的字符
@return YES(是九宮格拼音鍵盤)
*/-(BOOL)isNineKeyBoard:(NSString*)string{NSString*other =@"????????";intlen = (int)string.length;for(inti=0;i
下面就是現(xiàn)在UITextView禁止輸入表情的重要代碼,記得遵守代理~
#pragma mark -------UITextViewDelegate-(BOOL) textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text{}
UITextField在下面這個(gè)方法中寫就行
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string{
? ? if([textFieldisFirstResponder]) {
? ? ? ? if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage]) {
? ? ? ? ? ? returnNO;
? ? ? ? }
? ? ? ? //判斷鍵盤是不是九宮格鍵盤
? ? ? ? if([TKPublicisNineKeyBoard:string] ){
? ? ? ? ? ? returnYES;
? ? ? ? }else{
? ? ? ? ? ? if([TKPublichasEmoji:string] || [TKPublicstringContainsEmoji:string]){
? ? ? ? ? ? ? ? returnNO;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if(textField.text.length==20){
? ? ? ? ? ? if([stringisEqualToString:@""]) {
? ? ? ? ? ? ? ? returnYES;
? ? ? ? ? ? }else
? ? ? ? ? ? ? ? returnNO;
? ? ? ? }
? ? }
? ? return YES;
}
另外附上幾個(gè)有用的方法:
//-----過濾字符串中的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 = [regexstringByReplacingMatchesInString:text
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? options:0
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? range:NSMakeRange(0, [textlength])
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? withTemplate:@""];
? ? returnmodifiedString;
}
/**
?* 判斷 字母蔫巩、數(shù)字谆棱、中文
?*/
- (BOOL)isInputRuleAndNumber:(NSString*)str
{
? ? NSString*other =@"????????";? ? //九宮格的輸入值
? ? unsignedlonglen=str.length;
? ? for(inti=0;i
? ? {
? ? ? ? unichara=[strcharacterAtIndex:i];
? ? ? ? if(!((isalpha(a))
?? ? ? ? ? ? ||(isalnum(a))
?? ? ? ? ? ? //? ? ? ? ? ? ||((a=='_') || (a == '-')) //判斷是否允許下劃線,昵稱可能會用上
?? ? ? ? ? ? ||((a==' '))? ? ? ? ? ? ? ? //判斷是否允許空格
?? ? ? ? ? ? ||((a >=0x4e00&& a <=0x9fa6))
?? ? ? ? ? ? ||([otherrangeOfString:str].location!=NSNotFound)
?? ? ? ? ? ? ))
? ? ? ? ? ? returnNO;
? ? }
? ? return YES;
}
注意:上面這種方法可以限制鍵盤輸入任何表情符號圆仔,但是如果需求是必須要輸入表情垃瞧,而且要下次服務(wù)器把這個(gè)表情返回,還要回顯到頁面上坪郭,就要看下面這篇文章