UITextView以及UITextField禁止输入emoji表情

项目中需要禁止UITextView以及UITextField输入表情符号的需求,直接上代码

1、首先上判断字符串是否含有表情符号的代码

/**

 *  判断字符串中是否存在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;

}


/**

 *  判断字符串中是否存在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、然后是去除字符串中的表情

//去除字符串中所带的表情

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

}

3、由于苹果系统自带的九宫格输入汉字的过程中也会默认是表情符号,因此需要添加判断当前是否是九宫格键盘

/**

 判断是不是九宫格

 @param string  输入的字符

 @return YES(是九宫格拼音键盘)

 */

-(BOOL)isNineKeyBoard:(NSString *)string

{

    NSString *other = @"➋➌➍➎➏➐➑➒";

    int len = (int)string.length;

    for(int i=0;i<len;i++)

    {

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

            return NO;

    }

    return YES;

}


首先实现UITextView的禁止输入表情符号代码

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


    if ([textView isFirstResponder]) {

        //判断键盘是不是九宫格键盘

        if ([self isNineKeyBoard:text] ){

            return YES;

        }else{

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

                [self LGShowMsg:ForbiddenMsg];    // 提示框

                return NO;

            }

        }

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

            [self LGShowMsg:ForbiddenMsg];    // 提示框

            return NO;

        }

    }

    

    if ([text isEqualToString:@"\n"]) {

        [textView resignFirstResponder];

        return NO;

    }

    return YES;

}

- (void)textViewDidChange:(UITextView *)textView

{

    if (textView.text.length > 0 && [self stringContainsEmoji:textView.text]) {

        

        [self LGShowMsg:ForbiddenMsg];    // 提示框

        NSLog(@"有表情");

        // 禁止系统表情的输入

        NSString *text = [self disable_emoji:[textView text]];

        if (![text isEqualToString:textView.text]) {

            NSRange textRange = [textView selectedRange];

            textView.text = text;

            [textView setSelectedRange:textRange];

        }

    }

}

-(void)textViewDidEndEditing:(UITextView *)textView

{

    if ([self stringContainsEmoji:textView.text]) {

        [self LGShowMsg:@"禁止输入表情,请重新输入"];

        NSLog(@"有表情");

    }

}


然后实现UITextField的禁止输入表情符号代码

- (void)textFieldDidEndEditing:(UITextField *)textField

{

    if ([self stringContainsEmoji:textField.text]) {

        [self LGShowMsg:@"禁止输入表情,请重新输入"];

        NSLog(@"有表情");

    }

}


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

{

    if ([textField isFirstResponder]) {

        //判断键盘是不是九宫格键盘

        if ([self isNineKeyBoard:string] ){

            return YES;

        }else{

            if ([self hasEmoji:string] || [self stringContainsEmoji:string]){

                [self LGShowMsg:ForbiddenMsg];

                return NO;

            }

        }

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

            [self LGShowMsg:ForbiddenMsg];

            return NO;

        }

    }

    

    if ([string isEqualToString:@"\n"]) {

        [textField resignFirstResponder];

        return NO;

    }

    return YES;

    

    return YES;

}


- (void)textFieldDidChange:(UITextField *)TextField

{

    if (TextField.text.length > 0 && [self stringContainsEmoji:TextField.text]) {

        

        [self LGShowMsg:ForbiddenMsg];

        NSLog(@"有表情");

        // 禁止系统表情的输入

        NSString *text = [self disable_emoji:[TextField text]];

        TextField.text = text;

    }

}


猜你喜欢

转载自blog.csdn.net/u012891546/article/details/80524436