NSMutableAttributedString 中添加表情

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值