工具iOS进阶指南iOS开发技术分享

过滤Emoji表情的输入框

2016-04-24  本文已影响2456人  KevinTing

遇到一个比较奇葩的需求,输入文字的时候不能输入表情符号,但是现在苹果支持新的Unicode标准,本身就有一堆的emoji表情。没办法,只能在输入框上做文章,输入的时候过滤掉emoji表情。关键的地方在于过滤方法,下面是扩展NSString的过滤方法:

// 检查字符串是否包含emoji
- (BOOL)containsEmoji
{
    __block BOOL contain = NO;
    [self enumerateSubstringsInRange:NSMakeRange(0, self.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
        if ([substring isEmoji]) {
            contain = YES;
            *stop = YES;
        }
    }];
    
    return contain;
}

// 检查一个‘字符’是否是emoji表情
- (BOOL)isEmoji
{
    if (self.length <= 0) {
        return NO;
    }
    unichar first = [self characterAtIndex:0];
    switch (self.length) {
        case 1:
        {
            if (first == 0xa9 || first == 0xae || first == 0x2122 ||
                first == 0x3030 || (first >= 0x25b6 && first <= 0x27bf) ||
                first == 0x2328 || (first >= 0x23e9 && first <= 0x23fa)) {
                return YES;
            }
        }
            break;
            
        case 2:
        {
            unichar c = [self characterAtIndex:1];
            if (c == 0xfe0f) {
                if (first >= 0x203c && first <= 0x3299) {
                    return YES;
                }
            }
            if (first >= 0xd83c && first <= 0xd83e) {
                return YES;
            }
        }
            break;
            
        case 3:
        {
            unichar c = [self characterAtIndex:1];
            if (c == 0xfe0f) {
                if (first >= 0x23 && first <= 0x39) {
                    return YES;
                }
            }
            else if (c == 0xd83c) {
                if (first == 0x26f9 || first == 0x261d || (first >= 0x270a && first <= 0x270d)) {
                    return YES;
                }
            }
            if (first == 0xd83c) {
                return YES;
            }
        }
            break;
            
        case 4:
        {
            unichar c = [self characterAtIndex:1];
            if (c == 0xd83c) {
                if (first == 0x261d || first == 0x270c) {
                    return YES;
                }
            }
            if (first >= 0xd83c && first <= 0xd83e) {
                return YES;
            }
        }
            break;
            
        case 5:
        {
            if (first == 0xd83d) {
                return YES;
            }
        }
            break;
            
        case 8:
        case 11:
        {
            if (first == 0xd83d) {
                return YES;
            }
        }
            break;
            
        default:
            break;
    }
    
    return NO;
}

具体过滤过程比较简单:
1、监听UITextFieldTextDidChangeNotification(UITextField)或者UITextViewTextDidChangeNotification(UITextView);
2、记录lastText,在监听反馈中判断新输入的string是否存在emoji,是的话用lastText替换UITextField或者UITextView的内容,达到不输入emoji的目的,否则更新lastText为当前UITextField或者UITextView的内容。
最后效果如下:


过滤表情符号.gif

用法很简单:只用设置一个属性即可:

textField.shouldAvoidEmoji =YES;
textView.shouldAvoidEmoji =YES;

完整的项目在这里!

更新,更好的办法在这里

1、如果你只想输入英文,不用输入中文,那么过滤表情符号的话很简单:

textField.keyboardType=UIKeyboardTypeASCIICapable;

2、如果你想输入中文,但是不想输入表情符号,那么可以实现代理方法:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{        
    if ([textField isFirstResponder])
    {
        if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage])
        {
            return NO;
        }
    }
    return YES;
}

参考:http://stackoverflow.com/questions/25861468/how-to-disable-ios-8-emoji-keyboard

上一篇 下一篇

猜你喜欢

热点阅读