NSMutableAttributedString富文本

來源:互聯網
上載者:User

標籤:style   color   os   io   使用   ar   for   檔案   資料   

一、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可能和實際有所出入。

 

NSMutableAttributedString富文本

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.