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; } |