关闭

NSMutableAttributedString 中添加表情

802人阅读 评论(0) 收藏 举报
分类:

1
2
3
4
5
6
7
8
9
10
11
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithAttributedString:self.textView.attributedText];
 
NSTextAttachment *textAttachment = [[NSTextAttachment alloc] initWithData:nil ofType:nil] ;
 
textAttachment.image = [UIImage imageNamed:@"sky.png"];
    
NSAttributedString *textAttachmentString = [NSAttributedString attributedStringWithAttachment:textAttachment] ;
    
[string insertAttributedString:textAttachmentString atIndex:index];//index为用户指定要插入图片的位置
 
self.textView.attributedText = string;

//attributedText 计算字体时候设置要在attributedText中先设置字体 然后在方法中直接调用就行 !

CGSize contentSize = [status.attributedTextboundingRectWithSize:CGSizeMake(maxW,MAXFLOAT)options:NSStringDrawingUsesLineFragmentOrigincontext:nil].size;










/**

 *  普通文字 --> 属性文字

 *

 *  @param text普通文字

 *

 *  @return属性文字

 */

- (NSAttributedString *)attributedTextWithText:(NSString *)text

{

    NSMutableAttributedString *attributedText = [[NSMutableAttributedStringalloc] init];

    

    // 表情的规则

    NSString *emotionPattern =@"\\[[0-9a-zA-Z\\u4e00-\\u9fa5]+\\]";

    // @的规则

    NSString *atPattern =@"@[0-9a-zA-Z\\u4e00-\\u9fa5-_]+";

    // #话题#的规则

    NSString *topicPattern =@"#[0-9a-zA-Z\\u4e00-\\u9fa5]+#";

    // url链接的规则

    NSString *urlPattern =@"\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))";

    NSString *pattern = [NSStringstringWithFormat:@"%@|%@|%@|%@", emotionPattern, atPattern, topicPattern, urlPattern];

   

    // 遍历所有的特殊字符串

    NSMutableArray *parts = [NSMutableArrayarray];

    [text enumerateStringsMatchedByRegex:patternusingBlock:^(NSInteger captureCount,NSString *const__unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {

        if ((*capturedRanges).length ==0) return;

        

        HWTextPart *part = [[HWTextPartalloc] init];

        part.special = YES;

        part.text = *capturedStrings;

        part.emotion = [part.texthasPrefix:@"["] && [part.texthasSuffix:@"]"];

        part.range = *capturedRanges;

        [parts addObject:part];

    }];

    // 遍历所有的非特殊字符

    [text enumerateStringsSeparatedByRegex:patternusingBlock:^(NSInteger captureCount,NSString *const__unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {

        if ((*capturedRanges).length ==0) return;

        

        HWTextPart *part = [[HWTextPartalloc] init];

        part.text = *capturedStrings;

        part.range = *capturedRanges;

        [parts addObject:part];

    }];

    

    // 排序

    // 系统是按照从小 ->大的顺序排列对象

    [parts sortUsingComparator:^NSComparisonResult(HWTextPart *part1,HWTextPart *part2) {

        // NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending

        // 返回NSOrderedSame:两个一样大

        // NSOrderedAscending(升序):part2>part1

        // NSOrderedDescending(降序):part1>part2

        if (part1.range.location > part2.range.location) {

            // part1>part2

            // part1放后面, part2放前面

            returnNSOrderedDescending;

        }

        // part1<part2

        // part1放前面, part2放后面

        returnNSOrderedAscending;

    }];

    

   

    UIFont *font = [UIFontsystemFontOfSize:15];

    // 按顺序拼接每一段文字

    for (HWTextPart *partin parts) {

        // 等会需要拼接的子串

        NSAttributedString *substr = nil;

        if (part.isEmotion) {// 表情

            NSTextAttachment *attch = [[NSTextAttachmentalloc] init];

            NSString *name = [HWEmotionToolemotionWithChs:part.text].png;

            if (name) { // 能找到对应的图片

                attch.image = [UIImageimageNamed:name];

                attch.bounds = CGRectMake(0, -3, font.lineHeight, font.lineHeight);

                substr = [NSAttributedString attributedStringWithAttachment:attch];

            } else { // 表情图片不存在

                substr = [[NSAttributedString alloc] initWithString:part.text];

            }

        } else if (part.special) {// 非表情的特殊文字

           substr = [[NSAttributedString alloc] initWithString:part.textattributes:@{

                                                                              NSForegroundColorAttributeName : [UIColorredColor]

                                                                              }];

        } else { //非特殊文字

            substr = [[NSAttributedString alloc] initWithString:part.text];

        }

        [attributedText appendAttributedString:substr];

    }

    

    // 一定要设置字体,保证计算出来的尺寸是正确的

    [attributedText addAttribute:NSFontAttributeNamevalue:font range:NSMakeRange(0, attributedText.length)];

    

    return attributedText;

}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:75709次
    • 积分:2491
    • 等级:
    • 排名:第14809名
    • 原创:182篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条