• NSMutableAttributedString富文本


    一、ios5.0以前

    1、首先导入CoreText.framework,并在需要使用的文件中导入:

    #import<CoreText/CoreText.h>

    2、创建一个NSMutableAttributedString:

    1. NSMutableAttributedString *attriString = [[[NSMutableAttributedString alloc] initWithString:@"this is test!"]   
    2.                                               autorelease];  

    非常常规的创建方式,接下来我们给它配置属性:

    1. //把this的字体颜色变为红色  
    2. [attriString addAttribute:(NSString *)kCTForegroundColorAttributeName  
    3.                     value:(id)[UIColor redColor].CGColor   
    4.                     range:NSMakeRange(0, 4)];  
    5. //把is变为黄色  
    6. [attriString addAttribute:(NSString *)kCTForegroundColorAttributeName  
    7.                     value:(id)[UIColor yellowColor].CGColor   
    8.                     range:NSMakeRange(5, 2)];  
    9. //改变this的字体,value必须是一个CTFontRef  
    10. [attriString addAttribute:(NSString *)kCTFontAttributeName  
    11.                     value:(id)CTFontCreateWithName((CFStringRef)[UIFont boldSystemFontOfSize:14].fontName,  
    12.                                                    14,   
    13.                                                    NULL)  
    14.                     range:NSMakeRange(0, 4)];  
    15. //给this加上下划线,value可以在指定的枚举中选择  
    16. [attriString addAttribute:(NSString *)kCTUnderlineStyleAttributeName  
    17.                     value:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble]  
    18.                     range:NSMakeRange(0, 4)];  
    19. return attriString;  

    3、NSAttributedString继承于NSObject,并且不支持任何draw的方法,那我们就只能自己draw了。写一个UIView的子类(假设命名为TView),在initWithFrame中把背景色设为透明(self.backgroundColor = [UIColor clearColor]),然后在重写drawRect方法:

     在代码中我们调整了CTM(current transformation matrix),这是因为Quartz 2D的坐标系统不同,Quartz2D的坐标系统在左下角

    1. -(void)drawRect:(CGRect)rect{  
    2.     [super drawRect:rect];  
    3.       
    4.     NSAttributedString *attriString = getAttributedString();  
    5.       
    6.     CGContextRef ctx = UIGraphicsGetCurrentContext();  
    7.     CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, rect.size.height), 1.f, -1.f));  
    8.       
    9.     CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attriString);  
    10.     CGMutablePathRef path = CGPathCreateMutable();  
    11.     CGPathAddRect(path, NULL, rect);  
    12.       
    13.     CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);  
    14.     CFRelease(path);  
    15.     CFRelease(framesetter);  
    16.       
    17.     CTFrameDraw(frame, ctx);  
    18.     CFRelease(frame);  
    19. }  

    4、另外方法使用

     1)

    1. CATextLayer *textLayer = [CATextLayer layer];  
    2. textLayer.string = getAttributedString();  
    3. textLayer.frame = CGRectMake(0, CGRectGetMaxY(view.frame), 200, 200);  
    4. [self.view.layer addSublayer:textLayer];  

    CATextLayer可以直接支持NSAttributedString!

     

     

    2) UILabel *label = [[UILabel alloc] init];

     

        label.frame = CGRectMake(100, 100, 100, 40);

     

        [label setAttributedText:attrTitle];

     

        [self.view addSubview:label];

     

    二、在iOS6之后,创建一个AttributedString变成了一件轻松的事情,<CoreText/CoreText.h>已经不需要导入了。如果我要设置字体的颜色,可以直接这样:

    [textAttr addAttribute:NSForegroundColorAttributeName

                     value:[UIColor redColor]

                     range:NSMakeRange(0, text.length)];

    如果要计算一个NSAttributedString的size,使用NSAttributedString的这个API:

    - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context NS_AVAILABLE_IOS(6_0);

    但是需要注意一点,如果调用这个API的NSAttributedString不包含字体、行高等有利于计算的数据,那最终计算出来的size可能和实际有所出入。

     

  • 相关阅读:
    MySQL慢查询优化问题解决办法
    Jetpack的ViewModel与LiveData
    Jetpack的ViewModel与LiveData总结
    跟大家分享Entity Framework使用Code First方式如何连接到现有数据库
    SharePoint2010主题和样式揭秘(1)
    gitlab备份命令
    通过自定义字符串内插处理程序(InterpolatedStringHandler)和CallerArgumentExpression特性来实现一个好玩的场景
    Node.js基础入门第一天
    走进WPF之绘制冰墩墩
    Node.js基础入门第二天
  • 原文地址:https://www.cnblogs.com/swallow37/p/3951563.html
Copyright © 2020-2023  润新知