NSAttributedString

字面意思奏司,一個(gè)帶屬性的字符串伸刃。NSAttributedString為字符串提供豐富的展示效果提供了可能性谎砾,使用NSAttributedString可以很方便的實(shí)現(xiàn)在一段字符串中呈現(xiàn)不同的字體逢倍、不同的顏色捧颅、劃線、縮進(jìn)较雕、行間距碉哑、甚至圖文混排等不同的效果。
NSAttributedString提供了22種屬性的使用亮蒋,本文詳細(xì)介紹扣典。
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贮尖,這個(gè)可以理解為一個(gè)配置工具類,用來配置段落樣式趁怔,先講一下NSMutableParagraphStyle的所有屬性湿硝。

  • lineSpacing: 行間距
  • paragraphSpacing:段與段之間的間距
  • alignment:對齊方式
  • firstLineHeadIndent::首行縮進(jìn)
  • headIndent:除首行外的整體縮進(jìn)
  • tailIndent:右端文本縮進(jìn)
  • lineBreakMode:折行方式
  • minimumLineHeight:最小行高
  • maximumLineHeight:最大行高
  • baseWritingDirection:寫入方式
  • lineHeightMultiple:默認(rèn)行高的倍數(shù)
  • paragraphSpacingBefore:段首留白空間
  • hyphenationFactor:設(shè)置每行的最后單詞是否截?cái)啵?.0-1.0之間润努,默認(rèn)為0.0关斜,越接近1.0單詞被截?cái)嗟目赡苄栽酱?/li>
  • defaultTabInterval:默認(rèn)的tab間隔
  • allowsDefaultTighteningForTruncation:行間距調(diào)整收縮時(shí)允許截?cái)啵J(rèn)為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)];

注意下圖部分個(gè)別變化


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 下劃線
蘋果給下劃線樣式定義了一個(gè)枚舉

//無效果
NSUnderlineStyleNone                                    = 0x00,
//單行線
NSUnderlineStyleSingle                                  = 0x01,
//加粗單行線
NSUnderlineStyleThick API_AVAILABLE(macos(10.0), ios(7.0))      = 0x02,
//雙行線
NSUnderlineStyleDouble API_AVAILABLE(macos(10.0), ios(7.0))     = 0x09,
//以下單獨(dú)使用沒效果矗积,需要結(jié)合上面屬性一起使用
//無效果
NSUnderlineStylePatternSolid API_AVAILABLE(macos(10.0), ios(7.0))      = 0x0000,
//以下虛線效果可以自己嘗試著玩一下 value設(shè)置舉例:[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乍恐,負(fù)值為描邊效果评疗,見下圖

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 特殊效果,目前蘋果只提供一個(gè)可用效果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新建一個(gè)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中使用,在代理方法中捕捉點(diǎn)擊事件

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"]) {
       //點(diǎn)擊事件
    }
    return YES;
}

16洒扎、NSBaselineOffsetAttributeName 基線偏移辑甜,正值向上偏,負(fù)值向下偏

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中,只能以橫向排版

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載谍憔,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者匪蝙。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市习贫,隨后出現(xiàn)的幾起案子逛球,更是在濱河造成了極大的恐慌,老刑警劉巖苫昌,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颤绕,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奥务,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門物独,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氯葬,你說我怎么就攤上這事挡篓。” “怎么了溢谤?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵瞻凤,是天一觀的道長。 經(jīng)常有香客問我世杀,道長,這世上最難降的妖魔是什么肝集? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任瞻坝,我火速辦了婚禮,結(jié)果婚禮上杏瞻,老公的妹妹穿的比我還像新娘所刀。我一直安慰自己,他們只是感情好捞挥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布浮创。 她就那樣靜靜地躺著,像睡著了一般砌函。 火紅的嫁衣襯著肌膚如雪斩披。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天讹俊,我揣著相機(jī)與錄音垦沉,去河邊找鬼。 笑死仍劈,一個(gè)胖子當(dāng)著我的面吹牛厕倍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贩疙,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼讹弯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了这溅?” 一聲冷哼從身側(cè)響起组民,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芍躏,沒想到半個(gè)月后邪乍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年庇楞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榜配。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吕晌,死狀恐怖蛋褥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睛驳,我是刑警寧澤烙心,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站乏沸,受9級特大地震影響淫茵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹬跃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一匙瘪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝶缀,春花似錦丹喻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柄慰,卻和暖如春鳍悠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背先煎。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工贼涩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薯蝎。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓遥倦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親占锯。 傳聞我的和親對象是個(gè)殘疾皇子袒哥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容