NSAttributedString

字面意思,一个带属性的字符串。NSAttributedString为字符串提供丰富的展示效果提供了可能性,使用NSAttributedString可以很方便的实现在一段字符串中呈现不同的字体、不同的颜色、划线、缩进、行间距、甚至图文混排等不同的效果。
NSAttributedString提供了22种属性的使用,本文详细介绍。
1、NSFontAttributeName 字体属性

NSString *string = @"空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range1 = [string rangeOfString:@"空山新雨后"];
[attributeString addAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:20]} range:range1];
NSRange range2 = [string rangeOfString:@"清泉石上流"];
[attributeString addAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:20]} range:range2];
WeChat69e6c1da21a702215acf645d2589a2ad.png

2、NSParagraphStyleAttributeName 文本段落排版
在使用此属性前需要先了解NSMutableParagraphStyle,这个可以理解为一个配置工具类,用来配置段落样式,先讲一下NSMutableParagraphStyle的所有属性。

  • lineSpacing: 行间距
  • paragraphSpacing:段与段之间的间距
  • alignment:对齐方式
  • firstLineHeadIndent::首行缩进
  • headIndent:除首行外的整体缩进
  • tailIndent:右端文本缩进
  • lineBreakMode:折行方式
  • minimumLineHeight:最小行高
  • maximumLineHeight:最大行高
  • baseWritingDirection:写入方式
  • lineHeightMultiple:默认行高的倍数
  • paragraphSpacingBefore:段首留白空间
  • hyphenationFactor:设置每行的最后单词是否截断,在0.0-1.0之间,默认为0.0,越接近1.0单词被截断的可能性越大
  • defaultTabInterval:默认的tab间隔
  • allowsDefaultTighteningForTruncation:行间距调整收缩时允许截断,默认为NO
  • lineBreakStrategy:换行策略
NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 10;
paragraphStyle.alignment = NSTextAlignmentCenter;
[attributeString addAttributes:@{NSParagraphStyleAttributeName: paragraphStyle} range:NSMakeRange(0, string.length)];
WeChat0503b5d4363608bcb0c6b31d880a042f.png

3、NSForegroundColorAttributeName:文本颜色

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range1 = [string rangeOfString:@"空山新雨后"];
[attributeString addAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:20]} range:range1];
[attributeString addAttributes:@{NSForegroundColorAttributeName: UIColor.redColor} range:range1];
NSRange range2 = [string rangeOfString:@"清泉石上流"];
[attributeString addAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:20]} range:range2];
[attributeString addAttributes:@{NSForegroundColorAttributeName: UIColor.cyanColor} range:range2];
WeChata42e854d43169081d25e20ed41c03512.png

4、NSBackgroundColorAttributeName:背景颜色

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range1 = [string rangeOfString:@"空山新雨后"];
[attributeString addAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:20], NSBackgroundColorAttributeName: UIColor.redColor, NSForegroundColorAttributeName:UIColor.whiteColor} range:range1];
NSRange range2 = [string rangeOfString:@"清泉石上流"];
[attributeString addAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:20], NSBackgroundColorAttributeName: UIColor.cyanColor} range:range2];
WeChatf1b816be55da8bfa5a2c59dd46e19ed0.png

5、NSLigatureAttributeName 连体字符,不是所有字体都支持
0-不使用连体
1-使用连体

NSString *string = @"使用连体\nAction is character。 If we never did anything, we wouldn't be anybody。";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
[attributeString addAttributes:@{NSLigatureAttributeName: @1, NSFontAttributeName:[UIFont fontWithName:@"Zapfino" size:16]} range:NSMakeRange(0, string.length)];

注意下图部分个别变化


WeChat17fd6b4b6e31029a13ee042bdf19a19f.png
WeChat379c37752dbb0698b274000468c12ca3.png

6、NSKernAttributeName 文字间隔

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
[attributeString addAttributes:@{NSKernAttributeName: @10} range:NSMakeRange(0, string.length)];
WeChatcc49f93464fd9fbb9e413131182a16c7.png

7、NSTrackingAttributeName iOS14新出的属性
效果类似NSKernAttributeName

8、NSStrikethroughStyleAttributeName 删除线
value:1-7 单行线,9-15 双行线,依次加粗

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
[attributeString addAttributes:@{NSStrikethroughStyleAttributeName: @1} range:NSMakeRange(0, string.length)];
WeChat170beecb4d36f3d65ccdd08bdac22b63.png

9、NSUnderlineStyleAttributeName 下划线
苹果给下划线样式定义了一个枚举

//无效果
NSUnderlineStyleNone                                    = 0x00,
//单行线
NSUnderlineStyleSingle                                  = 0x01,
//加粗单行线
NSUnderlineStyleThick API_AVAILABLE(macos(10.0), ios(7.0))      = 0x02,
//双行线
NSUnderlineStyleDouble API_AVAILABLE(macos(10.0), ios(7.0))     = 0x09,
//以下单独使用没效果,需要结合上面属性一起使用
//无效果
NSUnderlineStylePatternSolid API_AVAILABLE(macos(10.0), ios(7.0))      = 0x0000,
//以下虚线效果可以自己尝试着玩一下 value设置举例:[NSNumber numberWithInteger:NSUnderlineStyleSingle | NSUnderlineStylePatternDot]
NSUnderlineStylePatternDot API_AVAILABLE(macos(10.0), ios(7.0))        = 0x0100,
NSUnderlineStylePatternDash API_AVAILABLE(macos(10.0), ios(7.0))       = 0x0200,
NSUnderlineStylePatternDashDot API_AVAILABLE(macos(10.0), ios(7.0))    = 0x0300,
NSUnderlineStylePatternDashDotDot API_AVAILABLE(macos(10.0), ios(7.0)) = 0x0400,
NSUnderlineStyleByWord API_AVAILABLE(macos(10.0), ios(7.0))            = 0x8000
NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
[attributeString addAttributes:@{NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle)} range:NSMakeRange(0, string.length)];
WeChat63d29fdec287007879fada98ee11a575.png

10、NSStrokeColorAttributeName 文字描边颜色,需要配合NSStrokeWidthAttributeName一起使用才有效果

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
[attributeString addAttributes:@{NSStrokeColorAttributeName:UIColor.redColor, NSStrokeWidthAttributeName: @2} range:NSMakeRange(0, string.length)];
WeChat8471f2ba9c9816ffa21c542bb600da84.png

11、NSStrokeWidthAttributeName 文字描边宽度
value为NSNumber类型,正值为镂空效果,参见NSStrokeColorAttributeName,负值为描边效果,见下图

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
[attributeString addAttributes:@{NSStrokeColorAttributeName:UIColor.redColor, NSStrokeWidthAttributeName: @-1} range:NSMakeRange(0, string.length)];
WeChatf51813d48f8d04879cc2d5a3031413e5.png

12、NSShadowAttributeName 文字阴影属性,value为NSShadow对象
NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";

NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSShadow *shadow = [NSShadow new];
shadow.shadowOffset = CGSizeMake(3, 3); //偏移量
shadow.shadowColor = UIColor.redColor;  //颜色
shadow.shadowBlurRadius = 3;            //模糊值
[attributeString addAttributes:@{NSShadowAttributeName:shadow} range:NSMakeRange(0, string.length)];
WeChatf49e32a4d6e97316fe7b974dc23b9eee.png

13、NSTextEffectAttributeName 特殊效果,目前苹果只提供一个可用效果NSTextEffectLetterpressStyle

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSShadow *shadow = [NSShadow new];
shadow.shadowOffset = CGSizeMake(3, 3); //偏移量
shadow.shadowColor = UIColor.redColor;  //颜色
shadow.shadowBlurRadius = 3;            //模糊值
[attributeString addAttributes:@{NSShadowAttributeName:shadow, NSTextEffectAttributeName:NSTextEffectLetterpressStyle} range:NSMakeRange(0, string.length)];
WeChat607042be664bbcca74884079e1a865f3.png

14、NSAttachmentAttributeName 附件属性,常用于图文混排,value为NSTextAttachment对象,需要使用NSTextAttachment新建一个NSAttributedString,与文字的NSMutableAttributedString拼接才有效果

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSTextAttachment *attachment = [NSTextAttachment new];
attachment.image = [UIImage imageNamed:@"baocai"];
attachment.bounds = CGRectMake(0, 0, 20, 20);
NSAttributedString *imageString = [NSAttributedString attributedStringWithAttachment:attachment];
[attributeString appendAttributedString:imageString];
WeChat2c0e0010f0b8b546a1b2d57b864c7e83.png

15、NSLinkAttributeName 超链接,无法在label中使用,只能在TextView中使用,在代理方法中捕捉点击事件

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range1 = [string rangeOfString:@"空山新雨后"];
[attributeString addAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:20], NSBackgroundColorAttributeName: UIColor.redColor, NSLinkAttributeName: @"click://空山新雨后"} range:range1];

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction
{
    if ([URL.scheme isEqualToString:@"click"]) {
       //点击事件
    }
    return YES;
}

16、NSBaselineOffsetAttributeName 基线偏移,正值向上偏,负值向下偏

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range1 = [string rangeOfString:@"空山新雨后"];
[attributeString addAttributes:@{NSBaselineOffsetAttributeName: @5, NSForegroundColorAttributeName: UIColor.redColor} range:range1];
WeChatf5b5cedb54cf45efae746a6f566bec14.png

17、NSUnderlineColorAttributeName 下划线颜色,配合NSUnderlineStyleAttributeName一起使用

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range1 = [string rangeOfString:@"空山新雨后"];
[attributeString addAttributes:@{NSUnderlineColorAttributeName: UIColor.redColor, NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)} range:range1];
WeChat47781d737c74fcc42513a380087f5ceb.png

18、NSStrikethroughColorAttributeName 删除线颜色,配合NSStrikethroughStyleAttributeName一起使用

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range1 = [string rangeOfString:@"空山新雨后"];
[attributeString addAttributes:@{NSStrikethroughColorAttributeName: UIColor.redColor, NSStrikethroughStyleAttributeName: @(2)} range:range1];
WeChatad9f41ed74c498a2a74f2dd2220d5bc8.png

19、NSObliquenessAttributeName 文字倾斜属性

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range1 = [string rangeOfString:@"空山新雨后"];
[attributeString addAttributes:@{NSForegroundColorAttributeName: UIColor.redColor, NSObliquenessAttributeName: @(0.5)} range:range1];
WeChatcefc673d389c2cda6f6b88252a960c7b.png

20、NSExpansionAttributeName 文字横向拉伸属性

NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range1 = [string rangeOfString:@"空山新雨后"];
[attributeString addAttributes:@{NSForegroundColorAttributeName: UIColor.redColor, NSExpansionAttributeName: @(0.5)} range:range1];
WeChatb83a047ef7560ed6ab2f0ad1d4bc83dc.png

21、NSWritingDirectionAttributeName 文字书写方向

NSWritingDirectionLeftToRight|NSWritingDirectionEmbedding
NSWritingDirectionRightToLeft|NSWritingDirectionEmbedding
NSWritingDirectionLeftToRight|NSWritingDirectionOverride
NSWritingDirectionRightToLeft|NSWritingDirectionOverride
NSString *string = @"山居秋暝\n空山新雨后 天气晚来秋\n明月松间照 清泉石上流";
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range1 = [string rangeOfString:@"空山新雨后"];
[attributeString addAttributes:@{NSForegroundColorAttributeName: UIColor.redColor, NSWritingDirectionAttributeName: @[@(NSWritingDirectionRightToLeft|NSWritingDirectionOverride)]} range:range1];
WeChat02dde67ed74a5b742fe1918536eb9f19.png

22、NSVerticalGlyphFormAttributeName 文字排版方向
value为NSNumber类型,0表示水平,1表示垂直,但在iOS中,只能以横向排版

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容