1. 程式人生 > >富文字簡單實用(一)

富文字簡單實用(一)

富文字(Normal)

改變某個字串中部分字元的顯示樣式

//NSFontAttributeName 設定字型屬性,預設值:字型:Helvetica(Neue) 字號:12

//NSForegroundColorAttributeNam 設定字型顏色,取值為 UIColor物件,預設值為黑色

//NSBackgroundColorAttributeName 設定字型所在區域背景顏色,取值為 UIColor物件,預設值為nil, 透明色

//NSLigatureAttributeName 設定連體屬性,取值為NSNumber 物件(整數),0 表示沒有連體字元,1 表示使用預設的連體字元

//NSKernAttributeName 設定字元間距,取值為 NSNumber物件(整數),正值間距加寬,負值間距變窄

//NSStrikethroughStyleAttributeName 設定刪除線,取值為 NSNumber 物件(整數)

//NSStrikethroughColorAttributeName 設定刪除線顏色,取值為 UIColor 物件,預設值為黑色

//NSUnderlineStyleAttributeName 設定下劃線,取值為 NSNumber 物件(整數),列舉常量NSUnderlineStyle中的值,與刪除線類似

//NSUnderlineColorAttributeName 設定下劃線顏色,取值為 UIColor 物件,預設值為黑色

//NSStrokeWidthAttributeName 設定筆畫寬度,取值為 NSNumber
物件(整數),負值填充效果,正值中空效果

//NSStrokeColorAttributeName 填充部分顏色,不是字型顏色,取值為 UIColor 物件

//NSShadowAttributeName 設定陰影屬性,取值為 NSShadow 物件

//NSTextEffectAttributeName 設定文字特殊效果,取值為 NSString
物件,目前只有圖版印刷效果可用:

//NSBaselineOffsetAttributeName 設定基線偏移值,取值為 NSNumber(float),正值上偏,負值下偏

//NSObliquenessAttributeName 設定字形傾斜度,取值為 NSNumber(float),正值右傾,負值左傾

//NSExpansionAttributeName 設定文字橫向拉伸屬性,取值為 NSNumber(float),正值橫向拉伸文字,負值橫向壓縮文字

//NSWritingDirectionAttributeName 設定文字書寫方向,從左向右書寫或者從右向左書寫

//NSVerticalGlyphFormAttributeName 設定文字排版方向,取值為 NSNumber 物件(整數),0 表示橫排文字,1 表示豎排文字

//NSLinkAttributeName 設定連結屬性,點選後呼叫瀏覽器開啟指定URL地址

//NSAttachmentAttributeName 設定文字附件,取值為NSTextAttachment物件,常用於文字圖片混排

//NSParagraphStyleAttributeName 設定文字段落排版格式,取值為 NSParagraphStyle 物件

NSMutableAttributedString *text = [[NSMutableAttributedString alloc]initWithString:@"《坦克世界》南北大區將於北京時間2016年04月01日09:45開放新模式“進擊月球”,屆時請您進入遊戲體驗。"];

    [text beginEditing];

    //改變字型大小
    //NSFontAttributeName:這個屬性的值是一個UIFont物件。使用這個屬性來更改字型的文字
    [text addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:30] range:NSMakeRange(1,4)];
    //字型的設定
    [text addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Optima" size:35] range:NSMakeRange(37, 6)];
    //    NSLog(@"%@",[UIFont familyNames]);


    //字型顏色
    //NSForegroundColorAttributeName:這個屬性的值是一個使用者介面顏色物件。使用這個屬性來指定文字中呈現的顏色。如果你不指定該屬性,文字呈現黑色。
    [text addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(37, 6)];

    //下劃線
    //NSUnderlineStyleAttributeName:描述文字中的下劃線屬性。預設是NSUnderlineStyleNone。
    [text addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleThick) range:NSMakeRange(16, 16)];

    //下劃線顏色(依附於下劃線)
        [text addAttribute:NSUnderlineColorAttributeName value:[UIColor blueColor] range:NSMakeRange(16, 16)];


    //刪除線
    //NSStrikethroughStyleAttributeName:描述文字中的下劃線屬性。預設是NSUnderlineStyleNone。
    [text addAttribute:NSStrikethroughStyleAttributeName value:@( NSUnderlineStyleSingle) range:NSMakeRange(1, 4)];

    //刪除線顏色(依附於刪除線)
    [text addAttribute:NSStrikethroughColorAttributeName value:[UIColor cyanColor] range:NSMakeRange(1, 4)];

    //新增背景色
    [text addAttribute:NSBackgroundColorAttributeName value:[UIColor lightGrayColor] range:NSMakeRange(1, 4)];

    //填充字
    [text addAttribute:NSStrokeWidthAttributeName value:@(-1) range:NSMakeRange(16, 16)];
    //空心字
    [text addAttribute:NSStrokeWidthAttributeName value:@(1) range:NSMakeRange(6, 4)];
    //改變填充字/空心字顏色(依附於填充字/空心字)
    [text addAttribute:NSStrokeColorAttributeName value:[UIColor greenColor] range:NSMakeRange(6, 4)];

    // 新增圖片
    /**
     步驟如下:

     建立NSTextAttachment的物件,用來裝在圖片
     將NSTextAttachment物件的image屬性設定為想要使用的圖片
     設定NSTextAttachment物件bounds大小,也就是要顯示的圖片的大小
     用[NSAttributedString attributedStringWithAttachment:attch]方法,將圖片新增到富文字上

     */
    // 新增圖片

    NSTextAttachment *attch = [[NSTextAttachment alloc] init];
    // 表情圖片
    attch.image = [UIImage imageNamed:@"tank"];
    // 設定圖片大小
    attch.bounds = CGRectMake(0, 0, 50, 50);

    // 建立帶有圖片的富文字
    NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:attch];


    [text appendAttributedString:string];

    [text endEditing];


    self.label.attributedText = text;

這裡寫圖片描述

富文字(CoreText)

首先記得

#import <CoreText/CoreText.h

在drawRect:中實現

 - (void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    [self coreText]; 
  }

CoreText 框架中最常用的幾個類:

  • CTFont

  • CTFontCollection

  • CTFontDescriptor

  • CTFrame

  • CTFramesetter

  • CTGlyphInfo

  • CTLine

  • CTParagraphStyle

  • CTRun

  • CTTextTab

  • CTTypesetter

//kCTFontAttributeName 這個鍵是字型的名稱 必須傳入CTFont物件
//kCTKernAttributeName 這個鍵設定字型間距 傳入必須是數字物件 預設為0
//kCTLigatureAttributeName 這個鍵設定連字方式 必須傳入CFNumber物件
//kCTParagraphStyleAttributeName 段落對其方式
//kCTForegroundColorAttributeName 字型顏色 必須傳入CGColor物件
//kCTStrokeWidthAttributeName 筆畫寬度 必須是CFNumber物件
//kCTStrokeColorAttributeName 筆畫顏色
//kCTSuperscriptAttributeName 控制垂直文字定位 CFNumber物件
//kCTUnderlineColorAttributeName 下劃線顏色

第一步:新增屬性

 NSMutableAttributedString *text = [[NSMutableAttributedString alloc]initWithString:@"《坦克世界》南北大區將於北京時間2016年04月01日09:45開放新模式“進擊月球”,屆時請您進入遊戲體驗。"];

    //開始編輯
    [text beginEditing];

    //設定字型屬性
    //引數1.字型的名字 引數2.字型的大小 引數3.字型的變換矩陣。在大多數情況下,將該引數設定為NULL。
    CTFontRef font = CTFontCreateWithName(CFSTR("Optima-Regular"), 25, NULL);
    [text addAttribute:(id)kCTFontAttributeName value:(__bridge id _Nonnull)(font) range:NSMakeRange(0, text.length)];

    //設定字型間隔
    long number = 10;

    //引數1.allocator:通過NULL或kCFAllocatorDefault使用預設的分配器。
    //引數2.theType:通過CFNumber用來顯示一個值的資料型別
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);

    //kCTKernAttributeName:字距調整
    [text addAttribute:(id)kCTKernAttributeName value:(__bridge id)num range:NSMakeRange(37, 6)];

    //設定字型顏色
    //kCTForegroundColorAttributeName:文字的前景顏色。該屬性的值必須是一個CGColor物件。預設值是黑色
    [text addAttribute:(NSString *)kCTForegroundColorAttributeName value:(id)[UIColor purpleColor].CGColor range:NSMakeRange(0, text.length)];

    //設定空心字
    long number2 = 3;
    CFNumberRef num2 = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number2);
    [text addAttribute:(id)kCTStrokeWidthAttributeName value:(__bridge id) num2 range:NSMakeRange(0, text.length)];

    //設定空心字顏色
    [text addAttribute:(id)kCTStrokeColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(16, 16)];

    //設定斜體字
    CTFontRef font2 = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:25].fontName, 25, NULL);
    [text addAttribute:(id)kCTFontAttributeName value:(__bridge id _Nonnull)(font2) range:NSMakeRange(16, 16)];

    //下劃線
    [text addAttribute:(id)kCTUnderlineStyleAttributeName value:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] range:NSMakeRange(16, 16)];

    //下劃線顏色
    [text addAttribute:(id)kCTUnderlineColorAttributeName value:(id)[UIColor greenColor].CGColor range:NSMakeRange(16, 16)];

    //對同一段字型進行多屬性設定
    //黑色
    NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)[UIColor blackColor].CGColor forKey:(id)kCTForegroundColorAttributeName];
    //字型
    CTFontRef font3 = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 40, NULL);
    [attributes setObject:(__bridge id)font3 forKey:(id)kCTFontAttributeName];
    //下劃線
    [attributes setObject:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] forKey:(id)kCTUnderlineStyleAttributeName];

    [text addAttributes:attributes range:NSMakeRange(1, 4)];

    //結束編輯
    [text endEditing];

第二步:繪圖、渲染

    //設定繪製文字區域
    CGMutablePathRef Path = CGPathCreateMutable();

    CGPathAddRect(Path, NULL ,self.bounds);


    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)text);


    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, text.length), Path, NULL);

    //獲取當前(View)上下文以用於之後的繪畫
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Flip the coordinate system
    CGContextSetTextMatrix(context , CGAffineTransformIdentity);

    //x,y軸方向移動
    CGContextTranslateCTM(context , 0 ,self.bounds.size.height);

    //縮放x,y軸方向縮放,-1.0為反向1.0倍,座標系轉換,沿x軸翻轉180度
    CGContextScaleCTM(context, 1.0 ,-1.0);

    //繪製
    CTFrameDraw(frame,context);

    //清理資源
    CGPathRelease(Path);
    CFRelease(framesetter);

這裡寫圖片描述