注:文章中部分代碼參考了這里,感謝原作者。
AttributedString可以分為NSAttributedString
和NSMutableAttributedString
兩種。在使用中通過將AttributedString賦值給控件的 attributedText 屬性來添加文字樣式。有屬性的控件有UILabel
、UITextField
和UITextView
。
使用方式一
初始化一個NSMutableAttributedString
,然后向里面添加文字樣式,將其賦給控件的attributedText屬性。(這種方式只是簡單的用幾個屬性表示了用法,在下面的一種使用方式中,會詳細總結所有屬性)
NSString *str = @"人生若只如初見,何事悲風秋畫扇。\n等閑變卻故人心,卻道故人心易變。\n驪山語罷清宵半,淚雨霖鈴終不怨。\n何如薄幸錦衣郎,比翼連枝當日愿。";
//創建NSMutableAttributedString
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc]initWithString:str];
//設置字體和設置字體的范圍
[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];
//自動換行
label.numberOfLines = 0;
//設置label的富文本
label.attributedText = attrStr;
//label高度自適應
[label sizeToFit];
[self.view addSubview:label];
使用方式二
創建屬性字典,并將各種屬性初始化。賦值,并利用方法appendAttributedString:
添加入NSMutableAttributedString
,將其賦給控件的attributedText屬性。
注釋感覺寫的挺詳細,就直接貼代碼了:
//初始化NSMutableAttributedString
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]init];
//設置字體格式和大小
NSString *str0 = @"設置字體格式和大小";
NSDictionary *dictAttr0 = @{NSFontAttributeName:[UIFont systemFontOfSize:14]};
NSAttributedString *attr0 = [[NSAttributedString alloc]initWithString:str0 attributes:dictAttr0];
[attributedString appendAttributedString:attr0];
//設置字體顏色
NSString *str1 = @"\n設置字體顏色\n";
NSDictionary *dictAttr1 = @{NSForegroundColorAttributeName:[UIColor purpleColor]};
NSAttributedString *attr1 = [[NSAttributedString alloc]initWithString:str1 attributes:dictAttr1];
[attributedString appendAttributedString:attr1];
//設置字體背景顏色
NSString *str2 = @"設置字體背景顏色\n";
NSDictionary *dictAttr2 = @{NSBackgroundColorAttributeName:[UIColor cyanColor]};
NSAttributedString *attr2 = [[NSAttributedString alloc]initWithString:str2 attributes:dictAttr2];
[attributedString appendAttributedString:attr2];
/*
注:NSLigatureAttributeName設置連體屬性,取值為NSNumber對象(整數),1表示使用默認的連體字符,0表示不使用,2表示使用所有連體符號(iOS不支持2)。而且并非所有的字符之間都有組合符合。如 fly ,f和l會連起來。
*/
//設置連體屬性
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用來設置字符之間的間距,取值為NSNumber對象(整數),負值間距變窄,正值間距變寬
*/
NSString *str4 = @"\n設置字符間距";
NSDictionary *dictAttr4 = @{NSKernAttributeName:@(4)};
NSAttributedString *attr4 = [[NSAttributedString alloc]initWithString:str4 attributes:dictAttr4];
[attributedString appendAttributedString:attr4];
/*!
注:NSStrikethroughStyleAttributeName設置刪除線,取值為NSNumber對象,枚舉NSUnderlineStyle中的值。NSStrikethroughColorAttributeName設置刪除線的顏色。并可以將Style和Pattern相互 取與 獲取不同的效果
*/
NSString *str51 = @"\n設置刪除線為細單實線,顏色為紅色";
NSDictionary *dictAttr51 = @{NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle),NSStrikethroughColorAttributeName:[UIColor redColor]};
NSAttributedString *attr51 = [[NSAttributedString alloc]initWithString:str51 attributes:dictAttr51];
[attributedString appendAttributedString:attr51];
NSString *str52 = @"\n設置刪除線為粗單實線,顏色為紅色";
NSDictionary *dictAttr52 = @{NSStrikethroughStyleAttributeName:@(NSUnderlineStyleThick),NSStrikethroughColorAttributeName:[UIColor redColor]};
NSAttributedString *attr52 = [[NSAttributedString alloc]initWithString:str52 attributes:dictAttr52];
[attributedString appendAttributedString:attr52];
NSString *str53 = @"\n設置刪除線為細單實線,顏色為紅色";
NSDictionary *dictAttr53 = @{NSStrikethroughStyleAttributeName:@(NSUnderlineStyleDouble),NSStrikethroughColorAttributeName:[UIColor redColor]};
NSAttributedString *attr53 = [[NSAttributedString alloc]initWithString:str53 attributes:dictAttr53];
[attributedString appendAttributedString:attr53];
NSString *str54 = @"\n設置刪除線為細單虛線,顏色為紅色";
NSDictionary *dictAttr54 = @{NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle|NSUnderlinePatternDot),NSStrikethroughColorAttributeName:[UIColor redColor]};
NSAttributedString *attr54 = [[NSAttributedString alloc]initWithString:str54 attributes:dictAttr54];
[attributedString appendAttributedString:attr54];
/*!
NSStrokeWidthAttributeName 設置筆畫的寬度,取值為NSNumber對象(整數),負值填充效果,正值是中空效果。NSStrokeColorAttributeName 設置填充部分顏色,取值為UIColor對象。
設置中間部分顏色可以使用 NSForegroundColorAttributeName 屬性來進行
*/
//設置筆畫寬度和填充部分顏色
NSString *str6 = @"設置筆畫寬度和填充顏色\n";
NSDictionary *dictAttr6 = @{NSStrokeWidthAttributeName:@(2),NSStrokeColorAttributeName:[UIColor blueColor]};
NSAttributedString *attr6 = [[NSAttributedString alloc]initWithString:str6 attributes:dictAttr6];
[attributedString appendAttributedString:attr6];
//設置陰影屬性,取值為NSShadow對象
NSString *str7 = @"設置陰影屬性\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];
//設置文本特殊效果,取值為NSString類型,目前只有一個可用效果 NSTextEffectLetterpressStyle(凸版印刷效果)
NSString *str8 = @"設置特殊效果\n";
NSDictionary *dictAttr8 = @{NSTextEffectAttributeName:NSTextEffectLetterpressStyle};
NSAttributedString *attr8 = [[NSAttributedString alloc]initWithString:str8 attributes:dictAttr8];
[attributedString appendAttributedString:attr8];
//設置文本附件,取值為NSTextAttachment對象,常用于文字的圖文混排
NSString *str9 = @"文字的圖文混排\n";
NSTextAttachment *textAttachment = [[NSTextAttachment alloc]init];
textAttachment.image = [UIImage imageNamed:@"logo.png"];
textAttachment.bounds = CGRectMake(0, 0, 30, 30);
NSDictionary *dictAttr9 = @{NSAttachmentAttributeName:textAttachment};
NSAttributedString *attr9 = [[NSAttributedString alloc]initWithString:str9 attributes:dictAttr9];
[attributedString appendAttributedString:attr9];
/*!
添加下劃線 NSUnderlineStyleAttributeName。設置下劃線的顏色 NSUnderlineColorAttributeName,對象為 UIColor。使用方式同刪除線一樣。
*/
//添加下劃線
NSString *str10 = @"添加下劃線\n";
NSDictionary *dictAttr10 = @{NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle),NSUnderlineColorAttributeName:[UIColor redColor]};
NSAttributedString *attr10 = [[NSAttributedString alloc]initWithString:str10 attributes:dictAttr10];
[attributedString appendAttributedString:attr10];
/*!
NSBaselineOffsetAttributeName 設置基線偏移值。取值為NSNumber (float),正值上偏,負值下偏
*/
//設置基線偏移值 NSBaselineOffsetAttributeName
NSString *str11 = @"添加基線偏移值\n";
NSDictionary *dictAttr11 = @{NSBaselineOffsetAttributeName:@(-10)};
NSAttributedString *attr11 = [[NSAttributedString alloc]initWithString:str11 attributes:dictAttr11];
[attributedString appendAttributedString:attr11];
/*!
NSObliquenessAttributeName 設置字體傾斜度,取值為 NSNumber(float),正值右傾,負值左傾
*/
//設置字體傾斜度 NSObliquenessAttributeName
NSString *str12 = @"設置字體傾斜度\n";
NSDictionary *dictAttr12 = @{NSObliquenessAttributeName:@(0.5)};
NSAttributedString *attr12 = [[NSAttributedString alloc]initWithString:str12 attributes:dictAttr12];
[attributedString appendAttributedString:attr12];
/*!
NSExpansionAttributeName 設置字體的橫向拉伸,取值為NSNumber (float),正值拉伸 ,負值壓縮
*/
//設置字體的橫向拉伸 NSExpansionAttributeName
NSString *str13 = @"設置字體橫向拉伸\n";
NSDictionary *dictAttr13 = @{NSExpansionAttributeName:@(0.5)};
NSAttributedString *attr13 = [[NSAttributedString alloc]initWithString:str13 attributes:dictAttr13];
[attributedString appendAttributedString:attr13];
/*!
NSWritingDirectionAttributeName 設置文字的書寫方向,取值為以下組合
@[@(NSWritingDirectionLeftToRight | NSWritingDirectionEmbedding)]
@[@(NSWritingDirectionLeftToRight | NSWritingDirectionOverride)]
@[@(NSWritingDirectionRightToLeft | NSWritingDirectionEmbedding)]
@[@(NSWritingDirectionRightToLeft | NSWritingDirectionOverride)]
???NSWritingDirectionEmbedding和NSWritingDirectionOverride有什么不同
*/
//設置文字的書寫方向 NSWritingDirectionAttributeName
NSString *str14 = @"設置文字書寫方向\n";
NSDictionary *dictAttr14 = @{NSWritingDirectionAttributeName:@[@(NSWritingDirectionRightToLeft | NSWritingDirectionEmbedding)]};
NSAttributedString *attr14 = [[NSAttributedString alloc]initWithString:str14 attributes:dictAttr14];
[attributedString appendAttributedString:attr14];
/*!
NSVerticalGlyphFormAttributeName 設置文字排版方向,取值為NSNumber對象(整數),0表示橫排文本,1表示豎排文本 在iOS中只支持0
*/
//設置文字排版方向 NSVerticalGlyphFormAttributeName
NSString *str15 = @"設置文字排版方向\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;
//對齊方式
paragraph.alignment = NSTextAlignmentLeft;
//指定段落開始的縮進像素
paragraph.firstLineHeadIndent = 30;
//調整全部文字的縮進像素
paragraph.headIndent = 10;
//添加段落設置
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, attributedString.length)];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(60, 100, 300, 0)];
label.backgroundColor = [UIColor lightGrayColor];
//自動換行
label.numberOfLines = 0;
//設置label的富文本
label.attributedText = attributedString;
//label高度自適應
[label sizeToFit];
[self.view addSubview:label];
例子中只是將單個的屬性進行展示,可以將不同的屬性進行組合來產生所需的效果
需要注意的兩個屬性:
-
NSTextAttachment
實現圖文混排 富文本AttributedString之簡單實現圖文混排(二) -
NSLinkAttributeName
實現設置鏈接屬性,點擊后調用瀏覽器打開指定的URL地址,參考富文本AttributedString總結(三)之鏈接屬性的設置