关闭

NSMutableAttributedString 中添加表情

1168人阅读 评论(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
查看评论

NSMutableAttributedString设置图片与文本的垂直位置

NSMutableAttributedString设置图片与文本的垂直位置
  • nhfc99
  • nhfc99
  • 2017-01-08 11:04
  • 694

iOS NSAttributedString所有文本属性详解(多图)

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK详解专栏 http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html前言:这篇文章算是整理吧,因为最近逛Stackoverfl...
  • Hello_Hwc
  • Hello_Hwc
  • 2015-07-02 22:14
  • 16666

遍历字符串 返回字符重复出现的次数

遍历字符串 返回字符重复出现的次数    NSString *string = [NSString stringWithFormat:@"liugang"];  char g = 'g'; ...
  • LG_CodeMachine
  • LG_CodeMachine
  • 2016-08-29 12:10
  • 689

NSMutableAttributedString使用介绍

与NSString类似,在iOS中AttributedString也分为NSAttributedString和NSMutableAttributedString,不同的是,AttributedString对象多了一个Attribute的概念,一个AttributedString的对象包含很多的属性,...
  • qq_31251767
  • qq_31251767
  • 2016-05-02 17:01
  • 4777

ios6 NSMutableAttributedString -[__NSCFType set]: unrecognized selector sent to instance 0xbbf3600

NSMutableAttributedString *atrriButedStr = [[[NSMutableAttributedString alloc] initWithString:titileName] autorelease];
  • zhouleizhao
  • zhouleizhao
  • 2014-07-24 08:51
  • 2380

iOS使用NSMutableAttributedString 实现富文本(不同颜色字体、下划线等)

在iOS开发中,常常会有一段文字显示不同的颜色和字体,或者给某几个文字加删除线或下划线的需求。之前在网上找了一些资料,有的是重绘UILabel的textLayer,有的是用html5实现的,都比较麻烦,而且很多UILabel的属性也不起作用了,效果都不理想。后来了解到NSMuttableAttstr...
  • reylen
  • reylen
  • 2014-11-17 14:20
  • 139965

在Label中显示表情

对于表情的的显示,希望大牛们多多给意见
  • zxs947941951
  • zxs947941951
  • 2015-08-19 14:05
  • 781

iOS 文本与图片表情混排的实现

2015-09-04 by 木易哥哥  要实现文图混排效果需要用到的有:富文本NSMutableAttributedString,字符替换substringWithRange,以及支持动画gif的ImageIO.h。 写了几个对象TQRichTextView,TQRichTextRunE...
  • manyxh
  • manyxh
  • 2015-09-04 15:06
  • 2890

NSTextAttachment实现图文混排

苹果在iOS7中推出了一个新的类NSTextAttachment,它是做图文混排的利器,本文就是用这个类,只用50行代码实现文字与表情混排,当然也可以实现段落中的图文混排。
  • July_sal
  • July_sal
  • 2016-09-06 11:28
  • 1771

UILable显示不同的字体颜色、字体大小、行间距、首行缩进、下划线等属性(NSMutableAttributedString)

案例1:修改文本字体大小、颜色属性 比如文本展示为姓名和性别,但是我们不能排除姓名会很长,所以此刻的lable宽度我们就不能写死,换句话说lable的宽度根据文本的内容来定 我经常用两种方式解决: 1.前面文章已经涉及:lable自适应http://blog.csdn.net/tuwan...
  • tuwanli125
  • tuwanli125
  • 2016-07-04 17:55
  • 1182
    个人资料
    • 访问:113981次
    • 积分:3133
    • 等级:
    • 排名:第13085名
    • 原创:209篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条