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;
}