NSMutableAttributedString 給文字添加下劃線

在網(wǎng)上查找的在此記錄下


在iOS開發(fā)中身害,有時(shí)會(huì)遇到需要添加下劃線,或者設(shè)置字符串中某幾個(gè)字的顏色的情況除嘹,最常見的栗子就是注冊(cè)頁(yè)面,如圖所示:

\

幾乎所有注冊(cè)頁(yè)面中都會(huì)出現(xiàn)這么一句話 “點(diǎn)擊下一步表示您已同意《用戶服務(wù)協(xié)議》”姨丈,而且可以看到,“《用戶服務(wù)協(xié)議》”幾個(gè)字是橙色的擅腰,并且它們下面還有下劃線蟋恬。這是怎么實(shí)現(xiàn)的呢?

有的同學(xué)可能會(huì)說(shuō):“不同顏色就設(shè)置兩個(gè)label趁冈,讓左邊的label顯示前半句并設(shè)置為黑色歼争,讓右邊的label顯示后半句并設(shè)置為橙色就行了∩保” 這樣也許是一個(gè)辦法沐绒,但是感覺有些麻煩,而且如果有很多種顏色呢呀邢?難道要設(shè)置一大堆label嗎洒沦。。价淌。

NSMutableAttributedString 就可以完美的解決這些問(wèn)題申眼。我們先說(shuō)一下和 attributes有關(guān)的四個(gè)方法:

為某一范圍內(nèi)文字設(shè)置多個(gè)屬性

- (void)setAttributes:(NSDictionary*)attrs range:(NSRange)range;

為某一范圍內(nèi)文字添加某個(gè)屬性

- (void)addAttribute:(NSString*)name value:(id)value range:(NSRange)range;

為某一范圍內(nèi)文字添加多個(gè)屬性

- (void)addAttributes:(NSDictionary*)attrs range:(NSRange)range;

移除某一范圍內(nèi)的某個(gè)屬性

- (void)removeAttribute:(NSString*)name range:(NSRange)range;

我們來(lái)舉個(gè)栗子吧:

- (void)viewDidLoad {

[super viewDidLoad];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, ScreenWidth, 40)];

label.font = [UIFont systemFontOfSize:18]; // 字體大小

label.textAlignment = NSTextAlignmentCenter; // 文字對(duì)齊方式

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:

@"點(diǎn)擊下一步表示您已同意《用戶服務(wù)協(xié)議》"];

[str addAttribute:NSForegroundColorAttributeName value:

[UIColor colorWithRed:100/255.0 green:100/255.0 blue:100/255.0 alpha:1] range:NSMakeRange(0,11)];

[str addAttribute:NSForegroundColorAttributeName value:

[UIColor colorWithRed:255/255.0 green:110/255.0 blue:17/255.0 alpha:1] range:NSMakeRange(11,8)];

label.attributedText = str;

[self.view addSubview:label];

}

我們創(chuàng)建一個(gè)NSMutableAttributedString 的對(duì)象 str,然后為它添加一個(gè)屬性蝉衣,這個(gè)屬性的名字叫做 NSForegroundColorAttributeName括尸,就是文字的顏色,它的值是 UIColor病毡,默認(rèn)是黑色濒翻,我們給它自定義一個(gè)顏色,然后設(shè)置它的范圍啦膜,NSMakeRange(0, 11) 的意思就是說(shuō)有送,從第0個(gè)字開始,一共11個(gè)字僧家。這個(gè)范圍其實(shí)就是 “點(diǎn)擊下一步表示您已同意” 這11個(gè)字雀摘。(事實(shí)上,第一幅圖中的這11個(gè)字并不是黑色八拱,但是和黑色比較接近阵赠,這不重要~)

然后我們又給這個(gè)字符串添加了一個(gè)屬性,這個(gè)屬性還是 NSForegroundColorAttributedName肌稻,但是顏色是橙色清蚀,并且范圍是從第11(別忘了編號(hào)從0開始)個(gè)字開始,一共8個(gè)字爹谭。這個(gè)范圍其實(shí)就是 “《用戶服務(wù)協(xié)議》“(書名號(hào)也算)

現(xiàn)在我們運(yùn)行程序來(lái)看看效果:

\

文字顏色已經(jīng)搞定了枷邪,接下來(lái)我們來(lái)加下劃線。我們?cè)谠瓉?lái)代碼的基礎(chǔ)上再加一句話:

- (void)viewDidLoad {

[super viewDidLoad];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, ScreenWidth, 40)];

label.font = [UIFont systemFontOfSize:18]; // 字體大小

label.textAlignment = NSTextAlignmentCenter; // 文字對(duì)齊方式

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:

@"點(diǎn)擊下一步表示您已同意《用戶服務(wù)協(xié)議》"];

[str addAttribute:NSForegroundColorAttributeName value:

[UIColor colorWithRed:100/255.0 green:100/255.0 blue:100/255.0 alpha:1] range:NSMakeRange(0,11)];

[str addAttribute:NSForegroundColorAttributeName value:

[UIColor colorWithRed:255/255.0 green:110/255.0 blue:17/255.0 alpha:1] range:NSMakeRange(11,8)];

[str addAttribute:NSUnderlineStyleAttributeName value:

[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(12, 6)]; // 下劃線

label.attributedText = str;

[self.view addSubview:label];

}

這句話的意思就是說(shuō)诺凡,給 str 添加一個(gè)屬性东揣,這個(gè)屬性的名字是 NSUnderlineStyleAttributeName药薯,也就是下劃線的類型。它的值是 NSInteger 類型的救斑,默認(rèn)是0童本,也就是沒(méi)有下劃線。范圍是從第12個(gè)字開始脸候,一共6個(gè)字穷娱。也就是 “用戶服務(wù)條款”。

這里要注意运沦。我們?cè)賮?lái)看一遍添加屬性的方法原型:

- (void)addAttribute:(NSString*)name value:(id)value range:(NSRange)range;

注意泵额,參數(shù) value 是 id 類型的⌒恚看到這句話嫁盲,你知道我想說(shuō)什么了嗎?

id 是 Objective-C 對(duì)象烈掠。而 NSInteger 是基本數(shù)據(jù)類型羞秤,不是對(duì)象。所以必須寫成 [NSNumber numberWithInteger:123] 的形式左敌。

在設(shè)置這個(gè)值的時(shí)候瘾蛋,我不知道具體應(yīng)該設(shè)為幾,我嘗試了好多數(shù)矫限,但是發(fā)現(xiàn)竟然有的不對(duì)哺哼。后來(lái)百度了一下,才知道原來(lái)它的值有一個(gè)枚舉:

typedef NS_ENUM(NSInteger, NSUnderlineStyle) {

NSUnderlineStyleNone? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x00,

NSUnderlineStyleSingle? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x01,

NSUnderlineStyleThick NS_ENUM_AVAILABLE(10_0, 7_0)? ? ? = 0x02,

NSUnderlineStyleDouble NS_ENUM_AVAILABLE(10_0, 7_0)? ? = 0x09,

NSUnderlinePatternSolid NS_ENUM_AVAILABLE(10_0, 7_0)? ? ? = 0x0000,

NSUnderlinePatternDot NS_ENUM_AVAILABLE(10_0, 7_0)? ? ? ? = 0x0100,

NSUnderlinePatternDash NS_ENUM_AVAILABLE(10_0, 7_0)? ? ? = 0x0200,

NSUnderlinePatternDashDot NS_ENUM_AVAILABLE(10_0, 7_0)? ? = 0x0300,

NSUnderlinePatternDashDotDot NS_ENUM_AVAILABLE(10_0, 7_0) = 0x0400,

NSUnderlineByWord NS_ENUM_AVAILABLE(10_0, 7_0)? ? ? ? ? ? = 0x8000

} NS_ENUM_AVAILABLE(10_0, 6_0);

實(shí)際上叼风,設(shè)置刪除線 NSStrikethroughColorAttributeName 的時(shí)候取董,值也是這個(gè)枚舉。

// NSUnderlineStyleNone 不設(shè)置下劃線/刪除線

// NSUnderlineStyleSingle 設(shè)置下劃線/刪除線為細(xì)的單線

// NSUnderlineStyleThick 設(shè)置下劃線/刪除線為粗的單線

// NSUnderlineStyleDouble 設(shè)置下劃線/刪除線為細(xì)的雙線

// NSUnderlinePatternSolid 設(shè)置下劃線/刪除線樣式為連續(xù)的實(shí)線

//NSUnderlinePatternDot 設(shè)置下劃線/刪除線樣式為點(diǎn)无宿,也就是虛線茵汰,比如這樣:------

// NSUnderlinePatterDash 設(shè)置下劃線/刪除線樣式為破折號(hào),比如這樣:—— —— ——

// NSUnderlinePatternDashDot 設(shè)置下劃線/刪除線樣式為連續(xù)的破折號(hào)和點(diǎn)懈贺,比如這樣:——-——-——-

// NSUnderlinePatternDashDotDot 設(shè)置下劃線/刪除線樣式為連續(xù)的破折號(hào)经窖、點(diǎn)坡垫、點(diǎn)梭灿,比如:——--——--——--

// NSUnderlineByWord 在有空格的地方不設(shè)置下劃線/刪除線

我為什么要把它們分成三段來(lái)說(shuō)呢?因?yàn)樗鼈儗儆谌N冰悠,設(shè)置的時(shí)候不一定只有一種堡妒,可以同時(shí)設(shè)置其中的某兩種或三種都設(shè)置。比如這樣:

[str addAttribute:NSUnderlineStyleAttributeName value:

[NSNumber numberWithInteger:NSUnderlineStyleDouble | NSUnderlinePatternDot] range:NSMakeRange(12, 6)];

這行代碼就是給 “用戶服務(wù)協(xié)議“ 加一個(gè)下劃線溉卓,但是這回的下劃線是兩行的皮迟,并且是虛線搬泥。

實(shí)際上下劃線的顏色也是可以設(shè)置的。如果沒(méi)有設(shè)置的話伏尼,默認(rèn)和文字顏色一樣忿檩,也就是橙色。我們來(lái)嘗試把下劃線換成藍(lán)色看看:

- (void)viewDidLoad {

[super viewDidLoad];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, ScreenWidth, 40)];

label.font = [UIFont systemFontOfSize:18]; // 字體大小

label.textAlignment = NSTextAlignmentCenter; // 文字對(duì)齊方式

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:

@"點(diǎn)擊下一步表示您已同意《用戶服務(wù)協(xié)議》"];

[str addAttribute:NSForegroundColorAttributeName value:

[UIColor colorWithRed:100/255.0 green:100/255.0 blue:100/255.0 alpha:1] range:NSMakeRange(0,11)];

[str addAttribute:NSForegroundColorAttributeName value:

[UIColor colorWithRed:255/255.0 green:110/255.0 blue:17/255.0 alpha:1] range:NSMakeRange(11,8)];

[str addAttribute:NSUnderlineStyleAttributeName value:

[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(12, 6)]; // 下劃線類型

[str addAttribute:NSUnderlineColorAttributeName value:

[UIColor blueColor] range:NSMakeRange(12, 6)]; // 下劃線顏色

label.attributedText = str;

[self.view addSubview:label];

}

運(yùn)行一下爆阶,結(jié)果如下圖所示:

\

我們?cè)倥e個(gè)栗子燥透,添加一個(gè)加粗版的刪除線,設(shè)置刪除線的顏色為黑色(如果不設(shè)置顏色辨图,也默認(rèn)和文字顏色一樣)

- (void)viewDidLoad {

[super viewDidLoad];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, ScreenWidth, 40)];

label.font = [UIFont systemFontOfSize:18]; // 字體大小

label.textAlignment = NSTextAlignmentCenter; // 文字對(duì)齊方式

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:

@"點(diǎn)擊下一步表示您已同意《用戶服務(wù)協(xié)議》"];

[str addAttribute:NSForegroundColorAttributeName value:

[UIColor colorWithRed:100/255.0 green:100/255.0 blue:100/255.0 alpha:1] range:NSMakeRange(0,11)];

[str addAttribute:NSForegroundColorAttributeName value:

[UIColor colorWithRed:255/255.0 green:110/255.0 blue:17/255.0 alpha:1] range:NSMakeRange(11,8)];

[str addAttribute:NSUnderlineStyleAttributeName value:

[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(12, 6)]; // 下劃線類型

[str addAttribute:NSUnderlineColorAttributeName value:

[UIColor blueColor] range:NSMakeRange(12, 6)]; // 下劃線顏色

[str addAttribute:NSStrikethroughStyleAttributeName value:

[NSNumber numberWithInteger:NSUnderlineStyleThick] range:NSMakeRange(12, 6)]; // 刪除線類型

[str addAttribute:NSStrikethroughColorAttributeName value:

[UIColor blackColor] range:NSMakeRange(12, 6)]; // 刪除線顏色

label.attributedText = str;

[self.view addSubview:label];

}

然后運(yùn)行一下來(lái)看看效果:

\

我們?cè)倥e最后一個(gè)栗子(栗子說(shuō):能不能別舉我了~)班套,設(shè)置填充:

- (void)viewDidLoad {

[super viewDidLoad];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, ScreenWidth, 40)];

label.font = [UIFont systemFontOfSize:18]; // 字體大小

label.textAlignment = NSTextAlignmentCenter; // 文字對(duì)齊方式

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:

@"點(diǎn)擊下一步表示您已同意《用戶服務(wù)協(xié)議》"];

[str addAttribute:NSForegroundColorAttributeName value:

[UIColor colorWithRed:100/255.0 green:100/255.0 blue:100/255.0 alpha:1] range:NSMakeRange(0,11)];

[str addAttribute:NSForegroundColorAttributeName value:

[UIColor colorWithRed:255/255.0 green:110/255.0 blue:17/255.0 alpha:1] range:NSMakeRange(11,8)];

[str addAttribute:NSStrokeWidthAttributeName value:

[NSNumber numberWithFloat:3.0] range:NSMakeRange(11, 8)]; // 設(shè)置填充

label.attributedText = str;

[self.view addSubview:label];

}

然后運(yùn)行一下來(lái)看看效果:

\

同理,填充也可以設(shè)置顏色故河,如果不設(shè)置的話吱韭,默認(rèn)和文字顏色一樣。

NSMutableAttributedString 還能設(shè)置很多其它屬性鱼的,比如段落格式理盆、陰影等等(還有很多哦)

想要完整的學(xué)習(xí)它請(qǐng)參考蘋果的官方文檔:傳送門

最后想說(shuō)一下它的缺點(diǎn),也許有的同學(xué)已經(jīng)發(fā)現(xiàn)了凑阶,下劃線離文字太近了熏挎!不能設(shè)置下劃線和文字的距離,這是它美中不足的地方晌砾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坎拐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子养匈,更是在濱河造成了極大的恐慌哼勇,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呕乎,死亡現(xiàn)場(chǎng)離奇詭異积担,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)猬仁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門帝璧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人湿刽,你說(shuō)我怎么就攤上這事的烁。” “怎么了诈闺?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵渴庆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)襟雷,這世上最難降的妖魔是什么刃滓? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮耸弄,結(jié)果婚禮上咧虎,老公的妹妹穿的比我還像新娘。我一直安慰自己计呈,他們只是感情好老客,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著震叮,像睡著了一般胧砰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苇瓣,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天尉间,我揣著相機(jī)與錄音,去河邊找鬼击罪。 笑死哲嘲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的媳禁。 我是一名探鬼主播眠副,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼竣稽!你這毒婦竟也來(lái)了囱怕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤毫别,失蹤者是張志新(化名)和其女友劉穎娃弓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛宦,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡台丛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砾肺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挽霉。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖变汪,靈堂內(nèi)的尸體忽然破棺而出侠坎,到底是詐尸還是另有隱情,我是刑警寧澤疫衩,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布硅蹦,位于F島的核電站,受9級(jí)特大地震影響闷煤,放射性物質(zhì)發(fā)生泄漏童芹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一鲤拿、第九天 我趴在偏房一處隱蔽的房頂上張望假褪。 院中可真熱鬧,春花似錦近顷、人聲如沸生音。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缀遍。三九已至,卻和暖如春饱须,著一層夾襖步出監(jiān)牢的瞬間域醇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蓉媳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留譬挚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓酪呻,卻偏偏與公主長(zhǎng)得像减宣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玩荠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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