zoukankan      html  css  js  c++  java
  • [代码] 类似 YYText 将表情文本转换成表情字符

    一,经历

    1> 由于工作需要,得把 UITextView 中的属性文本转换成普通文字,并将处理后的普通文字转换成属性文本.

    2> 将属性文本转换成普通文字简单,可以调用属性文本的enumerateAttribute:inRange:options:usingBlock:方法.

    3> 如何将普通文字中的表情符号[:xx]转换成显示的表情呢?这是一个很麻烦的过程,先贴上我研究了三四个小时的代码.

     1 -(NSMutableAttributedString *)EmojiTextInTextView:(NSString*)text
     2 {
     3     NSMutableAttributedString *emojiText = [[NSMutableAttributedString alloc]initWithString:text];
     4         NSArray *keys = [self.emojiManager.dictAllEmoji allKeys];
     5     
     6         // 若存在[:就遍历所有的表情
     7         do {
     8             BOOL bFindEmoji = NO;
     9             for (id key in keys) {
    10                 // 有表情
    11                 if ([text rangeOfString:key].location != NSNotFound) {
    12                     bFindEmoji = YES;
    13                     // 模拟属性字符串,使用普通文本占领表情位置,方便确定表情位置
    14                     NSRange range = [text rangeOfString:key];
    15                     text = [text stringByReplacingCharactersInRange:range withString:@"1"];
    16                     
    17                     // 转换成表情图片
    18                     UIImage *img = self.emojiManager.dictAllEmoji[key];
    19                     EmojiTextAttachment *attach = [[EmojiTextAttachment alloc]initWithData:nil ofType:nil];
    20                     if(img) attach.image = img;
    21                     attach.emojiTag = key;
    22                     NSAttributedString *replaceAttri = [NSAttributedString attributedStringWithAttachment:attach];
    23                     [emojiText replaceCharactersInRange:range withAttributedString:replaceAttri];
    24                     if ([text rangeOfString:@"[:"].location == NSNotFound){
    25                         break;
    26                     }
    27                 }
    28             }
    29             // 若没有查找到一个表情,就退出
    30             if (bFindEmoji == NO) {
    31                 break;
    32             } else {
    33                 bFindEmoji = NO;
    34             }
    35         }while ([text rangeOfString:@"[:"].location != NSNotFound);
    36     return emojiText;
    37 }

    4> 一开始没想到用双层循环,但是单层循环只会遍历一次表情字符串,如果文本中有多个表情字符串,就会漏掉,因此必须使用双层循环,外层用找到[:作为循环终止条件,内层用没有[:作为跳出跳出条件.

    5> 后来漏掉了包含[:但是不是表情字符串的情况,因此我就需要加一个 bool 变量,当遍历一次所有表情字符串,没有找到就让该变量置为 NO, 然后跳出第二层循环,排除有[:但是没有表情包的情况.

  • 相关阅读:
    java中变量的内存分配
    类加载器的双亲委派机制
    缓存行对齐
    缓存一致性与MESI协议
    Mysql优化之join优化
    MySQL crc32 & crc64函数 提高字符串查询效率
    线程不安全
    学习爱上 systemd
    Ubuntu如何备份和恢复系统
    redis报错overcommit_memory is set to 0
  • 原文地址:https://www.cnblogs.com/lz465350/p/5311777.html
Copyright © 2011-2022 走看看