在網(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è)置下劃線和文字的距離,這是它美中不足的地方晌砾。