NSAttributedString

隨著項(xiàng)目的不斷迭代,普通的文本屬性已經(jīng)無(wú)法滿足需求,就需要我們學(xué)習(xí)和使用更加靈活的富文本。AttributedString 可以分為 NSAttributedString 和 NSMutableAttributedString 兩種。在使用中通過(guò)將 AttributedString 賦值給控件的 attributedText 屬性來(lái)添加文字樣式。有此屬性的控件有 UILabelUITextFieldUITextView。

  • Character Attributes
  • Easy Use
  • Tool
  • Articles

Character Attributes

// 字體 - 默認(rèn)字體:Helvetica(Neue),字號(hào):12
UIKIT_EXTERN NSString * const NSFontAttributeName NS_AVAILABLE(10_0, 6_0);                // UIFont, default Helvetica(Neue) 12

// 段落 - 文本段落排版格式,行間距...
UIKIT_EXTERN NSString * const NSParagraphStyleAttributeName NS_AVAILABLE(10_0, 6_0);      // NSParagraphStyle, default defaultParagraphStyle

// 字體顏色 - 默認(rèn)為黑色
UIKIT_EXTERN NSString * const NSForegroundColorAttributeName NS_AVAILABLE(10_0, 6_0);     // UIColor, default blackColor

// 字體背景顏色 - 默認(rèn)為無(wú)背景色,看起來(lái)是透明色
UIKIT_EXTERN NSString * const NSBackgroundColorAttributeName NS_AVAILABLE(10_0, 6_0);     // UIColor, default nil: no background

// 連體字符 - 該屬性所對(duì)應(yīng)的值是一個(gè) NSNumber 對(duì)象(整數(shù))。連體字符是指某些連在一起的字符,它們采用單個(gè)的圖元符號(hào)。0 表示沒(méi)有連體字符。1 表示使用默認(rèn)的連體字符。2表示使用所有連體符號(hào)。默認(rèn)值為 1(注意,iOS 不支持值為 2)。
UIKIT_EXTERN NSString * const NSLigatureAttributeName NS_AVAILABLE(10_0, 6_0);            // NSNumber containing integer, default 1: default ligatures, 0: no ligatures

// 字間距 - 該屬性所對(duì)應(yīng)的值是一個(gè) NSNumber 對(duì)象(整數(shù))。字母緊排指定了用于調(diào)整字距的像素點(diǎn)數(shù)。字母緊排的效果依賴于字體。值為 0 表示不使用字母緊排。默認(rèn)值為0。 
UIKIT_EXTERN NSString * const NSKernAttributeName NS_AVAILABLE(10_0, 6_0);                // NSNumber containing floating point value, in points; amount to modify default kerning. 0 means kerning is disabled.

// 刪除線 - 取值為 NSNumber 對(duì)象(整數(shù))
UIKIT_EXTERN NSString * const NSStrikethroughStyleAttributeName NS_AVAILABLE(10_0, 6_0);  // NSNumber containing integer, default 0: no strikethrough

// 下劃線 - 取值為 NSNumber 對(duì)象(整數(shù)),枚舉常量 NSUnderlineStyle 中的值,與刪除線類似
UIKIT_EXTERN NSString * const NSUnderlineStyleAttributeName NS_AVAILABLE(10_0, 6_0);      // NSNumber containing integer, default 0: no underline

// 填充部分顏色 - 不是字體顏色,取值為 UIColor 對(duì)象
UIKIT_EXTERN NSString * const NSStrokeColorAttributeName NS_AVAILABLE(10_0, 6_0);         // UIColor, default nil: same as foreground color

// 筆畫寬度(粗細(xì)) - 取值為 NSNumber 對(duì)象(整數(shù)),負(fù)值填充效果,正值中空效果
UIKIT_EXTERN NSString * const NSStrokeWidthAttributeName NS_AVAILABLE(10_0, 6_0);         // NSNumber containing floating point value, in percent of font point size, default 0: no stroke; positive for stroke alone, negative for stroke and fill (a typical value for outlined text would be 3.0)

// 陰影屬性 - 取值為 NSShadow 對(duì)象
UIKIT_EXTERN NSString * const NSShadowAttributeName NS_AVAILABLE(10_0, 6_0);              // NSShadow, default nil: no shadow

// 文本特殊效果 - 取值為 NSString 對(duì)象,目前只有圖版印刷效果可用
UIKIT_EXTERN NSString * const NSTextEffectAttributeName NS_AVAILABLE(10_10, 7_0);          // NSString, default nil: no text effect

// 文本附件 - 取值為 NSTextAttachment 對(duì)象,常用于文字圖片混排
UIKIT_EXTERN NSString * const NSAttachmentAttributeName NS_AVAILABLE(10_0, 7_0);          // NSTextAttachment, default nil

// 鏈接屬性 - 點(diǎn)擊后調(diào)用瀏覽器打開(kāi)指定URL地址
UIKIT_EXTERN NSString * const NSLinkAttributeName NS_AVAILABLE(10_0, 7_0);                // NSURL (preferred) or NSString

// 基線偏移值 - 取值為 NSNumber (float),正值上偏,負(fù)值下偏
UIKIT_EXTERN NSString * const NSBaselineOffsetAttributeName NS_AVAILABLE(10_0, 7_0);      // NSNumber containing floating point value, in points; offset from baseline, default 0

// 下劃線顏色 - 默認(rèn)為黑色
UIKIT_EXTERN NSString * const NSUnderlineColorAttributeName NS_AVAILABLE(10_0, 7_0);      // UIColor, default nil: same as foreground color

// 刪除線顏色 - 默認(rèn)為黑色
UIKIT_EXTERN NSString * const NSStrikethroughColorAttributeName NS_AVAILABLE(10_0, 7_0);  // UIColor, default nil: same as foreground color

// 字形傾斜度 - 取值為 NSNumber (float),正值右傾,負(fù)值左傾
UIKIT_EXTERN NSString * const NSObliquenessAttributeName NS_AVAILABLE(10_0, 7_0);         // NSNumber containing floating point value; skew to be applied to glyphs, default 0: no skew

// 文本橫向拉伸屬性 - 取值為 NSNumber (float),正值橫向拉伸文本,負(fù)值橫向壓縮文本
UIKIT_EXTERN NSString * const NSExpansionAttributeName NS_AVAILABLE(10_0, 7_0);           // NSNumber containing floating point value; log of expansion factor to be applied to glyphs, default 0: no expansion

// 文字書寫方向 - 從左向右書寫或者從右向左書寫
UIKIT_EXTERN NSString * const NSWritingDirectionAttributeName NS_AVAILABLE(10_6, 7_0);    // NSArray of NSNumbers representing the nested levels of writing direction overrides as defined by Unicode LRE, RLE, LRO, and RLO characters.  The control characters can be obtained by masking NSWritingDirection and NSTextWritingDirection values.  LRE: NSWritingDirectionLeftToRight|NSWritingDirectionEmbedding, RLE: NSWritingDirectionRightToLeft|NSWritingDirectionEmbedding, LRO: NSWritingDirectionLeftToRight|NSWritingDirectionOverride, RLO: NSWritingDirectionRightToLeft|NSWritingDirectionOverride,

// 文字排版方向 - 取值為 NSNumber 對(duì)象(整數(shù)),0 表示橫排文本,1 表示豎排文本
UIKIT_EXTERN NSString * const NSVerticalGlyphFormAttributeName NS_AVAILABLE(10_7, 6_0); 

Easy Use

1. Example One

初始化一個(gè) NSMutableAttributedString ,然后向里面添加文字樣式,將其賦給控件的 attributedText 屬性。

Code

NSString *str = @"人生若只如初見(jiàn),何事悲風(fēng)秋畫扇。\n等閑變卻故人心,卻道故人心易變。\n驪山語(yǔ)罷清宵半,淚雨霖鈴終不怨。\n何如薄幸錦衣郎,比翼連枝當(dāng)日愿。";

// 創(chuàng)建 NSMutableAttributedString
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:str];
 
// 設(shè)置字體和設(shè)置字體的范圍
[attrStr addAttribute:NSFontAttributeName
                value:[UIFont systemFontOfSize:30.0f]
                range:NSMakeRange(0, 3)];
// 添加文字顏色
[attrStr addAttribute:NSForegroundColorAttributeName
                value:[UIColor redColor]
                range:NSMakeRange(17, 7)];
// 添加文字背景顏色
[attrStr addAttribute:NSBackgroundColorAttributeName
                value:[UIColor orangeColor]
                range:NSMakeRange(17, 7)];
// 添加下劃線
[attrStr addAttribute:NSUnderlineStyleAttributeName
                value:[NSNumber numberWithInteger:NSUnderlineStyleSingle]
                range:NSMakeRange(8, 7)];

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(60, 100, 200, 0)];
label.backgroundColor = [UIColor greenColor];
// 自動(dòng)換行
label.numberOfLines = 0;
// 設(shè)置label的富文本
label.attributedText = attrStr;
// label高度自適應(yīng)
[label sizeToFit];
[self.view addSubview:label];

Sketch

Simulator Screen Shot.png

2. Example Two

創(chuàng)建屬性字典,并將各種屬性初始化。賦值,并利用方法 appendAttributedString:
添加入 NSMutableAttributedString ,將其賦給控件的 attributedText 屬性。

Code

// 初始化NSMutableAttributedString
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init];

// 設(shè)置字體格式和大小
NSString *str0 = @"設(shè)置字體格式和大小";
NSDictionary *dictAttr0 = @{NSFontAttributeName:[UIFont systemFontOfSize:14]};
NSAttributedString *attr0 = [[NSAttributedString alloc] initWithString:str0
                                                            attributes:dictAttr0];
[attributedString appendAttributedString:attr0];

// 設(shè)置字體顏色
NSString *str1 = @"\n設(shè)置字體顏色\n";
NSDictionary *dictAttr1 = @{NSForegroundColorAttributeName:[UIColor purpleColor]};
NSAttributedString *attr1 = [[NSAttributedString alloc] initWithString:str1
                                                            attributes:dictAttr1];
[attributedString appendAttributedString:attr1];

// 設(shè)置字體背景顏色
NSString *str2 = @"設(shè)置字體背景顏色\n";
NSDictionary *dictAttr2 = @{NSBackgroundColorAttributeName:[UIColor cyanColor]};
NSAttributedString *attr2 = [[NSAttributedString alloc] initWithString:str2
                                                            attributes:dictAttr2];
[attributedString appendAttributedString:attr2];

/*
 注:NSLigatureAttributeName設(shè)置連體屬性,取值為NSNumber對(duì)象(整數(shù)),1表示使用默認(rèn)的連體字符,0表示不使用,2表示使用所有連體符號(hào)(iOS不支持2)。而且并非所有的字符之間都有組合符合。如 fly ,f和l會(huì)連起來(lái)。
 */
//設(shè)置連體屬性
NSString *str3 = @"fly";
NSDictionary *dictAttr3 = @{
                            NSFontAttributeName:[UIFont fontWithName:@"futura" size:14],
                            NSLigatureAttributeName:[NSNumber numberWithInteger:1]
                            };
NSAttributedString *attr3 = [[NSAttributedString alloc]initWithString:str3
                                                           attributes:dictAttr3];
[attributedString appendAttributedString:attr3];

/*!
 注:NSKernAttributeName用來(lái)設(shè)置字符之間的間距,取值為NSNumber對(duì)象(整數(shù)),負(fù)值間距變窄,正值間距變寬
 */

NSString *str4 = @"\n設(shè)置字符間距";
NSDictionary *dictAttr4 = @{NSKernAttributeName:@(4)};
NSAttributedString *attr4 = [[NSAttributedString alloc]initWithString:str4
                                                           attributes:dictAttr4];
[attributedString appendAttributedString:attr4];

/*!
 注:NSStrikethroughStyleAttributeName設(shè)置刪除線,取值為NSNumber對(duì)象,枚舉NSUnderlineStyle中的值。NSStrikethroughColorAttributeName設(shè)置刪除線的顏色。并可以將Style和Pattern相互 取與 獲取不同的效果
 */

NSString *str51 = @"\n設(shè)置刪除線為細(xì)單實(shí)線,顏色為紅色";
NSDictionary *dictAttr51 = @{
                             NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle),
                             NSStrikethroughColorAttributeName:[UIColor redColor]
                             };
NSAttributedString *attr51 = [[NSAttributedString alloc]initWithString:str51
                                                            attributes:dictAttr51];
[attributedString appendAttributedString:attr51];

NSString *str52 = @"\n設(shè)置刪除線為粗單實(shí)線,顏色為紅色";
NSDictionary *dictAttr52 = @{
                             NSStrikethroughStyleAttributeName:@(NSUnderlineStyleThick),
                             NSStrikethroughColorAttributeName:[UIColor redColor]
                             };
NSAttributedString *attr52 = [[NSAttributedString alloc]initWithString:str52
                                                            attributes:dictAttr52];
[attributedString appendAttributedString:attr52];

NSString *str53 = @"\n設(shè)置刪除線為細(xì)單實(shí)線,顏色為紅色";
NSDictionary *dictAttr53 = @{
                             NSStrikethroughStyleAttributeName:@(NSUnderlineStyleDouble),
                             NSStrikethroughColorAttributeName:[UIColor redColor]
                             };
NSAttributedString *attr53 = [[NSAttributedString alloc]initWithString:str53
                                                            attributes:dictAttr53];
[attributedString appendAttributedString:attr53];

NSString *str54 = @"\n設(shè)置刪除線為細(xì)單虛線,顏色為紅色";
NSDictionary *dictAttr54 = @{
                             NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle|NSUnderlinePatternDot),
                             NSStrikethroughColorAttributeName:[UIColor redColor]
                             };
NSAttributedString *attr54 = [[NSAttributedString alloc]initWithString:str54
                                                            attributes:dictAttr54];
[attributedString appendAttributedString:attr54];

/*!
 NSStrokeWidthAttributeName 設(shè)置筆畫的寬度,取值為NSNumber對(duì)象(整數(shù)),負(fù)值填充效果,正值是中空效果。NSStrokeColorAttributeName  設(shè)置填充部分顏色,取值為UIColor對(duì)象。
 設(shè)置中間部分顏色可以使用 NSForegroundColorAttributeName 屬性來(lái)進(jìn)行
 */
//設(shè)置筆畫寬度和填充部分顏色
NSString *str6 = @"設(shè)置筆畫寬度和填充顏色\n";
NSDictionary *dictAttr6 = @{
                            NSStrokeWidthAttributeName:@(2),
                            NSStrokeColorAttributeName:[UIColor blueColor]
                            };
NSAttributedString *attr6 = [[NSAttributedString alloc]initWithString:str6
                                                           attributes:dictAttr6];
[attributedString appendAttributedString:attr6];

//設(shè)置陰影屬性,取值為NSShadow對(duì)象
NSString *str7 = @"設(shè)置陰影屬性\n";
NSShadow *shadow = [[NSShadow alloc]init];
shadow.shadowColor = [UIColor redColor];
shadow.shadowBlurRadius = 1.0f;
shadow.shadowOffset = CGSizeMake(1, 1);
NSDictionary *dictAttr7 = @{NSShadowAttributeName:shadow};
NSAttributedString *attr7 = [[NSAttributedString alloc]initWithString:str7
                                                           attributes:dictAttr7];
[attributedString appendAttributedString:attr7];

//設(shè)置文本特殊效果,取值為NSString類型,目前只有一個(gè)可用效果  NSTextEffectLetterpressStyle(凸版印刷效果)
NSString *str8 = @"設(shè)置特殊效果\n";
NSDictionary *dictAttr8 = @{NSTextEffectAttributeName:NSTextEffectLetterpressStyle};
NSAttributedString *attr8 = [[NSAttributedString alloc]initWithString:str8
                                                           attributes:dictAttr8];
[attributedString appendAttributedString:attr8];

//設(shè)置文本附件,取值為NSTextAttachment對(duì)象,常用于文字的圖文混排
NSString *str9 = @"文字的圖文混排\n";
NSTextAttachment *textAttachment = [[NSTextAttachment alloc]init];
textAttachment.image = [UIImage imageNamed:@"logo"];
textAttachment.bounds = CGRectMake(0, 0, 30, 30);
NSDictionary *dictAttr9 = @{NSAttachmentAttributeName:textAttachment};
NSAttributedString *attr9 = [[NSAttributedString alloc]initWithString:str9
                                                           attributes:dictAttr9];
[attributedString appendAttributedString:attr9];

/*!
 添加下劃線 NSUnderlineStyleAttributeName。設(shè)置下劃線的顏色 NSUnderlineColorAttributeName,對(duì)象為 UIColor。使用方式同刪除線一樣。
 */
//添加下劃線
NSString *str10 = @"添加下劃線\n";
NSDictionary *dictAttr10 = @{
                             NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle),
                             NSUnderlineColorAttributeName:[UIColor redColor]
                             };
NSAttributedString *attr10 = [[NSAttributedString alloc]initWithString:str10
                                                            attributes:dictAttr10];
[attributedString appendAttributedString:attr10];

/*!
 NSBaselineOffsetAttributeName 設(shè)置基線偏移值。取值為NSNumber (float),正值上偏,負(fù)值下偏
 */
//設(shè)置基線偏移值 NSBaselineOffsetAttributeName
NSString *str11 = @"添加基線偏移值\n";
NSDictionary *dictAttr11 = @{NSBaselineOffsetAttributeName:@(-10)};
NSAttributedString *attr11 = [[NSAttributedString alloc]initWithString:str11
                                                            attributes:dictAttr11];
[attributedString appendAttributedString:attr11];

/*!
 NSObliquenessAttributeName 設(shè)置字體傾斜度,取值為 NSNumber(float),正值右傾,負(fù)值左傾
 */
//設(shè)置字體傾斜度 NSObliquenessAttributeName
NSString *str12 = @"設(shè)置字體傾斜度\n";
NSDictionary *dictAttr12 = @{NSObliquenessAttributeName:@(0.5)};
NSAttributedString *attr12 = [[NSAttributedString alloc]initWithString:str12
                                                            attributes:dictAttr12];
[attributedString appendAttributedString:attr12];

/*!
 NSExpansionAttributeName 設(shè)置字體的橫向拉伸,取值為NSNumber (float),正值拉伸 ,負(fù)值壓縮
 */
//設(shè)置字體的橫向拉伸 NSExpansionAttributeName
NSString *str13 = @"設(shè)置字體橫向拉伸\n";
NSDictionary *dictAttr13 = @{NSExpansionAttributeName:@(0.5)};
NSAttributedString *attr13 = [[NSAttributedString alloc]initWithString:str13
                                                            attributes:dictAttr13];
[attributedString appendAttributedString:attr13];

/*!
 NSWritingDirectionAttributeName 設(shè)置文字的書寫方向,取值為以下組合
 @[@(NSWritingDirectionLeftToRight | NSWritingDirectionEmbedding)]
 @[@(NSWritingDirectionLeftToRight | NSWritingDirectionOverride)]
 @[@(NSWritingDirectionRightToLeft | NSWritingDirectionEmbedding)]
 @[@(NSWritingDirectionRightToLeft | NSWritingDirectionOverride)]
 
 ???NSWritingDirectionEmbedding和NSWritingDirectionOverride有什么不同
 */
//設(shè)置文字的書寫方向 NSWritingDirectionAttributeName
NSString *str14 = @"設(shè)置文字書寫方向\n";
NSDictionary *dictAttr14 = @{NSWritingDirectionAttributeName:@[@(NSWritingDirectionRightToLeft | NSWritingDirectionEmbedding)]};
NSAttributedString *attr14 = [[NSAttributedString alloc]initWithString:str14
                                                            attributes:dictAttr14];
[attributedString appendAttributedString:attr14];

/*!
 NSVerticalGlyphFormAttributeName 設(shè)置文字排版方向,取值為NSNumber對(duì)象(整數(shù)),0表示橫排文本,1表示豎排文本  在iOS中只支持0
 */
//設(shè)置文字排版方向 NSVerticalGlyphFormAttributeName
NSString *str15 = @"設(shè)置文字排版方向\n";
NSDictionary *dictAttr15 = @{NSVerticalGlyphFormAttributeName:@(0)};
NSAttributedString *attr15 = [[NSAttributedString alloc]initWithString:str15
                                                            attributes:dictAttr15];
[attributedString appendAttributedString:attr15];

//段落樣式
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc]init];
//行間距
paragraph.lineSpacing = 10;
//段落間距
paragraph.paragraphSpacing = 20;
//對(duì)齊方式
paragraph.alignment = NSTextAlignmentLeft;
//指定段落開(kāi)始的縮進(jìn)像素
paragraph.firstLineHeadIndent = 30;
//調(diào)整全部文字的縮進(jìn)像素
paragraph.headIndent = 10;

//添加段落設(shè)置
[attributedString addAttribute:NSParagraphStyleAttributeName
                         value:paragraph
                         range:NSMakeRange(0, attributedString.length)];

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(60, 0, 300, 0)];
label.backgroundColor = [UIColor lightGrayColor];
//自動(dòng)換行
label.numberOfLines = 0;
//設(shè)置label的富文本
label.attributedText = attributedString;
//label高度自適應(yīng)
[label sizeToFit];
[self.view addSubview:label];

Tool

封裝了一個(gè)小工具來(lái)處理一些簡(jiǎn)單的富文本需求。

Demo

Code

UILabel *lbl1 = [[UILabel alloc] initWithFrame:CGRectMake(10, 64, 300, 20)];
lbl1.text = @"春江花朝秋月夜";
[self.view addSubview:lbl1];

UILabel *lbl2 = [[UILabel alloc] initWithFrame:CGRectMake(10, 104, 300, 20)];
lbl2.text = @"春江花朝秋月夜";
[self.view addSubview:lbl2];

YYLinkTextViewItem *item1 = [[YYLinkTextViewItem alloc]init];
item1.textColor = [UIColor blackColor];
item1.textContent = @"春江花朝";
item1.textFont = [UIFont systemFontOfSize:10];

YYLinkTextViewItem *item2 = [[YYLinkTextViewItem alloc]init];
item2.textColor = [UIColor orangeColor];
item2.textContent = @"秋月夜";
item2.textFont = [UIFont systemFontOfSize:20];
NSAttributedString *attStr = [YYAttributedString yy_attributeWithLinkTextViewItems:@[item1,item2]];

lbl2.attributedText = attStr;

Sketch

Simulator Screen Shot.png

GitHub

Articles

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容