美文网首页
iOS Emoji表情输入长度判断,及被截取导致的显示异常的处理

iOS Emoji表情输入长度判断,及被截取导致的显示异常的处理

作者: 左方 | 来源:发表于2020-06-02 14:52 被阅读0次
    - (void)textFieldEditChanged:(UITextField *)textField
    {
        NSString *lang = [[UIApplication sharedApplication] textInputMode].primaryLanguage;// 键盘输入模式
        if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
            UITextRange *selectedRange = [textField markedTextRange];
            //获取高亮部分
            UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
            // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
            if (!position) {
                [self handleTextFieldCharLength:textField];
            }
        }
        // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
        else{
            [self handleTextFieldCharLength:textField];
        }
    }
    

    1.保证emoji输入小于要求的长度

    /**
     处理textField文本的长度
     */
    - (void)handleTextFieldCharLength:(UITextField *)textField
    {
        NSString *toBeString = textField.text;
        NSString *str =[toBeString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        if (str.length > WordsNumber) {
            __block NSRange subrange;
            [textField.text enumerateSubstringsInRange:NSMakeRange(0, toBeString.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop)
            {
                subrange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, str.length-substringRange.length)];
            }];
            NSString * result = [toBeString substringWithRange:subrange];
            textField.text = result;
        }
    }
    

    2.按照一个emoji长度为1,显示输入的文字字数。

    /**
     处理textField文本的长度
     */
    - (void)handleTextFieldCharLength:(UITextField *)textField
    {
        NSString *str = textField.text;
        NSUInteger charTotal = [self countCharacterLength:str];
        if (charTotal > WordsNumber) {
            NSMutableArray *characters = [NSMutableArray array];
            [textField.text enumerateSubstringsInRange:NSMakeRange(0, str.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
                if (characters.count < WordsNumber) {
                    [characters addObject:substring];
                }
                else{
                    *stop = true;
                }
            }];
            NSString *resultStr = [characters componentsJoinedByString:@""];
            NSUInteger subCharTotal = [self countCharacterLength:resultStr];
            textField.text = resultStr;
            _wordsNum.text=[NSString stringWithFormat:@"%lu",WordsNumber-subCharTotal];
        }
        else{
            _wordsNum.text=[NSString stringWithFormat:@"%lu",WordsNumber-charTotal];
        }
    }
    /**
     计算输入的字符长度
     */
    - (NSUInteger)countCharacterLength:(NSString *)test
    {
        __block NSUInteger total = 0;
        [test enumerateSubstringsInRange:NSMakeRange(0, test.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
            total++;
        }];
        DDLogInfo(@"当前输入字符总数%lu",(unsigned long)total);
        return total;
    }
    

    Emoji参考资料:
    1.iOS 对于表情符号 emoji被截断问题
    https://blog.csdn.net/bug_delete/article/details/90694630
    2.深入理解Emoji(一) —— 字符集,字符集编码
    https://www.jianshu.com/p/ca191d9bdcc0
    3.深入理解Emoji(二) —— 字节序和BOM
    https://www.jianshu.com/p/ca191d9bdcc0
    4.深入理解Emoji(三) —— Emoji详解
    https://juejin.im/post/5c00b31a5188251d9e0c4a59

    相关文章

      网友评论

          本文标题:iOS Emoji表情输入长度判断,及被截取导致的显示异常的处理

          本文链接:https://www.haomeiwen.com/subject/afyuzhtx.html