UILabel
是一種文本視圖,支持顯示一行或多行的只讀文本体斩,算是大家的常用視圖類梭稚,不過雖然用得多,同樣的效果絮吵,用了很多不同方法弧烤,時(shí)間久了,難免有些混淆疑惑源武,本篇從以下幾個(gè)方面做一個(gè)歸納總結(jié):
- 自定義字體
- 制作不規(guī)則的邊框
- 顯示不同字體和顏色
- 調(diào)整縮進(jìn)與行距
如本文題圖這樣的標(biāo)題,就是使用以上四步編碼出來的想幻,下面將逐步介紹實(shí)現(xiàn)它粱栖。
1. 自定義字體
iOS9系統(tǒng)里,系統(tǒng)默認(rèn)的中文字體是“蘋方”脏毯,雖然是很優(yōu)雅的中文字體闹究,不過愛天馬行空的UI設(shè)計(jì)美眉一定不會(huì)滿足,總是愛找“最美”的字體來搭配她們的設(shè)計(jì)食店,iOS系統(tǒng)中往往沒有這些字體渣淤,這時(shí)候怎么辦呢?
步驟一:找到UI效果圖中的字體文件
字體文件術(shù)語稱為矢量字庫(kù)吉嫩,一般是以TTF結(jié)尾的价认,你可以請(qǐng)教UI設(shè)計(jì)美眉:“請(qǐng)問,你這幅效果圖某某位置用的是什么字體呀自娩?”(多好的搭訕機(jī)會(huì))用踩,比如本文題圖中“自定義”三個(gè)字用的是“方正正纖黑”這款字體,這時(shí)有經(jīng)驗(yàn)的設(shè)計(jì)美眉一定會(huì)把TTF文件傳給你,這里假設(shè)就是方正正纖黑.TTF
脐彩,雙擊該文件用字體冊(cè)
查看碎乃,記錄下顯示的字體名稱FZZhengHeiS-EL-GB
,后面會(huì)用到惠奸。
步驟二:將TTF文件導(dǎo)入Xcode工程
注意接下來的導(dǎo)入選項(xiàng)梅誓,特別
Add to targets
千萬不能漏選,否則后面的將導(dǎo)致后面的步驟失敺鹉稀:步驟三:在plist文件中添加配置
添加
Fonts provided by application
梗掰,點(diǎn)擊Item 0
的Value欄,填入方正正纖黑.TTF
共虑, 注意 這里的名字與步驟二導(dǎo)入的TTF文件的文件名一致愧怜。
步驟四:查看系統(tǒng)加載的字體
在任意m文件,運(yùn)行以下代碼:
// 獲取系統(tǒng)字體名稱:
for(NSString *fontfamilyname in [UIFont familyNames]) {
NSLog(@"family:'%@'",fontfamilyname);
for (NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname]) {
NSLog(@"\\\\tfont:'%@'",fontName);
}
NSLog(@"-------------");
}
// Swift 版
for fontfamilyname in UIFont.familyNames {
print("family:" + fontfamilyname)
for fontName in UIFont.fontNames(forFamilyName: fontfamilyname) {
print("\\\\tfont:" + fontName)
}
print("-------------")
}
這段代碼遍歷了當(dāng)前iOS系統(tǒng)安裝的全部字體妈拌,在輸出控制臺(tái)查找(快捷鍵?F
)步驟一最后查出的字體名稱FZZhengHeiS-EL-GB
拥坛,復(fù)制font:
后面的FZZXHJW--GB1-0
,這才是最后我們要用的字體名稱尘分。
如果這里查找不到自己導(dǎo)入的字體名稱猜惋,說明步驟二導(dǎo)入選項(xiàng)沒有正確勾選,刪除項(xiàng)目中的TTF文件培愁,重做步驟二著摔。
步驟五:使用導(dǎo)入的字體
UILabel *aLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, w, h)];
[self.view addSubview:aLabel];
aLabel.text = @"自定義UILabel";
aLabel.textAlignment = NSTextAlignmentCenter; // 設(shè)置文字對(duì)齊方式為居中
aLabel.textColor = [UIColor whiteColor]; // 設(shè)置文字顏色為白色
aLabel.font = [UIFont fontWithName:@"FZZXHJW--GB1-0" size:25];
這樣我們就初步使用了自定義的字體代替了系統(tǒng)默認(rèn)字體。
2. 制作不規(guī)則的邊框
提起圓角矩形定续,很多iOS開發(fā)者腦子里立刻浮現(xiàn)的是UIView的layer屬性:
view.layer.cornerRadius = 5
但是遇到如題圖中這樣需要指定哪一個(gè)角為圓角的效果谍咆,layer
并沒有對(duì)應(yīng)的屬性,這里我們就需要使用CALayer的一個(gè)子類CAShapeLayer
私股,直接來看代碼:
//定義路徑參數(shù):
CGRect rect = CGRectMake(0, 0, w, h);
CGSize radii = CGSizeMake(20, 20); // 定義原角大小
UIRectCorner corners = UIRectCornerTopLeft |
UIRectCornerBottomRight; // 標(biāo)記左上和右下為圓角
//創(chuàng)建路徑摹察,這里使用貝塞爾曲線
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];
//創(chuàng)建CAShapeLayer
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.fillColor = [UIColor clearColor].CGColor;//RGBA(169, 252, 121, 0.5).CGColor;
shapeLayer.strokeColor = RGBA(169, 252, 121, 0.8).CGColor; // 設(shè)置線條的顏色
shapeLayer.lineWidth = 6;
shapeLayer.lineJoin = kCALineJoinRound;
shapeLayer.lineCap = kCALineCapRound;
shapeLayer.path = path.CGPath; // 指定前面設(shè)置好path
// 將創(chuàng)建好的CAShapeLayer添加為UILabel的子layer
[aLabel.layer addSublayer:shapeLayer];
3. 顯示不同字體和顏色
aLabel.text
是大家常用來配置實(shí)際文字的屬性,配合font
屬性倡鲸,我們只能設(shè)置全部文字為一個(gè)字體供嚎,如果需要為自定義
和UILabel
指定不同的字體,有些新手就會(huì)定義兩個(gè)Label峭状,將這個(gè)問題轉(zhuǎn)換為兩個(gè)Label位置的拼湊克滴,這里介紹UILabel自帶的attributedText
屬性,比使用多個(gè)Label在視圖適配上有很大的優(yōu)勢(shì)优床。
// 創(chuàng)建NSMutableAttributedString
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString: @"自定義UILabel\\n 溪石 "];
// 設(shè)置文字顏色
[str addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, 3)];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(3, 8)];
// 設(shè)置陰影
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor darkGrayColor];
shadow.shadowOffset = CGSizeMake(2.0f, 2.0f);
[str addAttribute:NSShadowAttributeName value:shadow range:NSMakeRange(0, 10)];
// 設(shè)置文字顏色
[str addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(11, 4)];
// 設(shè)置背景顏色
[str addAttribute:NSBackgroundColorAttributeName value:[UIColor orangeColor] range:NSMakeRange(11, 4)];
// 指定字體劝赔,這里使用了三種字體
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"FZZXHJW--GB1-0" size:28.0] range:NSMakeRange(0, 3)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:28.0] range:NSMakeRange(3, 8)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"PingFangSC-Light" size:20.0] range:NSMakeRange(11, 4)];
// 將配置好的NSMutableAttributedString傳給attributedText屬性
aLabel.attributedText = str;
注意,使用attributedText屬性后胆敞,原text屬性將被忽略望忆。
4. 調(diào)整縮進(jìn)與行距
運(yùn)行后可以看見罩阵,字體和顏色被區(qū)分開來,還加上了陰影效果启摄,不過發(fā)現(xiàn)問題了嗎稿壁?溪石
并沒有顯示出來,因?yàn)槎x時(shí)@"自定義UILabel\\n 溪石 "
歉备,溪石
前插入了一個(gè)換行符\\n
傅是,導(dǎo)致文本被分成了兩行,而UILabel默認(rèn)只顯示一行蕾羊,溪石顯示到了第二行喧笔,因此看不見!所以需要設(shè)置行數(shù):
aLabel.numberOfLines = 0;
這里怎么是零龟再?书闸!我要的是換行,起碼大于1吧利凑!這里當(dāng)然可以設(shè)置1浆劲、2、3...表示需要的行數(shù)哀澈,不過牌借,0表示“無限行”,適用于自動(dòng)換行等無法確切知道總行數(shù)的情形割按。
接著膨报,還是回到
attributedText
進(jìn)行設(shè)置:
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 8.0;//調(diào)整行間距
paragraphStyle.alignment = NSTextAlignmentCenter;
[str addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [str length])];
這里用lineSpacing
屬性設(shè)置了行間距,另外又設(shè)置了一次對(duì)齊屬性alignment
适荣,因?yàn)樵O(shè)置文本格式會(huì)覆蓋UILabel
的textAlignment
屬性现柠,因此需要重新設(shè)置一次。
出發(fā)吧弛矛!這里只是起點(diǎn)
到這里够吩,UILabel的定制方法基本都已經(jīng)介紹到了,再來復(fù)習(xí)一下:
- 自定義字體:介紹了如何使用系統(tǒng)之外的TTF字庫(kù)來設(shè)置Font汪诉。
- 制作不規(guī)則的邊框:介紹了用CALayer和CAShapeLayer及貝塞爾路徑來自定義UILabel的邊框废恋,包括形狀與顏色谈秫。
- 顯示不同字體和顏色:用
attributedText
屬性代替text
屬性扒寄,這樣可以對(duì)一段文字分別設(shè)定文字的樣式。 - 調(diào)整縮進(jìn)與行距:在
attributedText
的基礎(chǔ)上拟烫,利用NSMutableParagraphStyle設(shè)置行高等“段落屬性”该编。
實(shí)際上,大家是不是有點(diǎn)兒體會(huì)到硕淑,UILabel的定制和Word等文本編輯器中的“排版”知識(shí)是一致的课竣,在對(duì)UI設(shè)計(jì)越來越重視的軟件開發(fā)實(shí)踐中嘉赎,“富文本”排版是不可或缺的知識(shí),剛開始開發(fā)iOS的小伙伴于樟,可以以本文中介紹的知識(shí)為基礎(chǔ)公条,進(jìn)一步了解各個(gè)類的屬性,做出多種多樣的文字效果迂曲!
【歡迎關(guān)注溪石靶橱,獲取更多開發(fā)技巧】