UILabel
是一種文本視圖,支持顯示一行或多行的只讀文本,算是大家的常用視圖類,不過雖然用得多,同樣的效果,用了很多不同方法,時間久了,難免有些混淆疑惑,本篇從以下幾個方面做一個歸納總結:
- 自定義字體
- 制作不規則的邊框
- 顯示不同字體和顏色
- 調整縮進與行距
如本文題圖這樣的標題,就是使用以上四步編碼出來的,下面將逐步介紹實現它。
1. 自定義字體
iOS9系統里,系統默認的中文字體是“蘋方”,雖然是很優雅的中文字體,不過愛天馬行空的UI設計美眉一定不會滿足,總是愛找“最美”的字體來搭配她們的設計,iOS系統中往往沒有這些字體,這時候怎么辦呢?
步驟一:找到UI效果圖中的字體文件
字體文件術語稱為矢量字庫,一般是以TTF結尾的,你可以請教UI設計美眉:“請問,你這幅效果圖某某位置用的是什么字體呀?”(多好的搭訕機會),比如本文題圖中“自定義”三個字用的是“方正正纖黑”這款字體,這時有經驗的設計美眉一定會把TTF文件傳給你,這里假設就是方正正纖黑.TTF
,雙擊該文件用字體冊
查看,記錄下顯示的字體名稱FZZhengHeiS-EL-GB
,后面會用到。
步驟二:將TTF文件導入Xcode工程
注意接下來的導入選項,特別
Add to targets
千萬不能漏選,否則后面的將導致后面的步驟失?。?br>
步驟三:在plist文件中添加配置
添加
Fonts provided by application
,點擊Item 0
的Value欄,填入方正正纖黑.TTF
, 注意 這里的名字與步驟二導入的TTF文件的文件名一致。
步驟四:查看系統加載的字體
在任意m文件,運行以下代碼:
// 獲取系統字體名稱:
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("-------------")
}
這段代碼遍歷了當前iOS系統安裝的全部字體,在輸出控制臺查找(快捷鍵?F
)步驟一最后查出的字體名稱FZZhengHeiS-EL-GB
,復制font:
后面的FZZXHJW--GB1-0
,這才是最后我們要用的字體名稱。
如果這里查找不到自己導入的字體名稱,說明步驟二導入選項沒有正確勾選,刪除項目中的TTF文件,重做步驟二。
步驟五:使用導入的字體
UILabel *aLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, w, h)];
[self.view addSubview:aLabel];
aLabel.text = @"自定義UILabel";
aLabel.textAlignment = NSTextAlignmentCenter; // 設置文字對齊方式為居中
aLabel.textColor = [UIColor whiteColor]; // 設置文字顏色為白色
aLabel.font = [UIFont fontWithName:@"FZZXHJW--GB1-0" size:25];
這樣我們就初步使用了自定義的字體代替了系統默認字體。
2. 制作不規則的邊框
提起圓角矩形,很多iOS開發者腦子里立刻浮現的是UIView的layer屬性:
view.layer.cornerRadius = 5
但是遇到如題圖中這樣需要指定哪一個角為圓角的效果,layer
并沒有對應的屬性,這里我們就需要使用CALayer的一個子類CAShapeLayer
,直接來看代碼:
//定義路徑參數:
CGRect rect = CGRectMake(0, 0, w, h);
CGSize radii = CGSizeMake(20, 20); // 定義原角大小
UIRectCorner corners = UIRectCornerTopLeft |
UIRectCornerBottomRight; // 標記左上和右下為圓角
//創建路徑,這里使用貝塞爾曲線
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];
//創建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; // 設置線條的顏色
shapeLayer.lineWidth = 6;
shapeLayer.lineJoin = kCALineJoinRound;
shapeLayer.lineCap = kCALineCapRound;
shapeLayer.path = path.CGPath; // 指定前面設置好path
// 將創建好的CAShapeLayer添加為UILabel的子layer
[aLabel.layer addSublayer:shapeLayer];
3. 顯示不同字體和顏色
aLabel.text
是大家常用來配置實際文字的屬性,配合font
屬性,我們只能設置全部文字為一個字體,如果需要為自定義
和UILabel
指定不同的字體,有些新手就會定義兩個Label,將這個問題轉換為兩個Label位置的拼湊,這里介紹UILabel自帶的attributedText
屬性,比使用多個Label在視圖適配上有很大的優勢。
// 創建NSMutableAttributedString
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString: @"自定義UILabel\\n 溪石 "];
// 設置文字顏色
[str addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, 3)];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(3, 8)];
// 設置陰影
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)];
// 設置文字顏色
[str addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(11, 4)];
// 設置背景顏色
[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. 調整縮進與行距
運行后可以看見,字體和顏色被區分開來,還加上了陰影效果,不過發現問題了嗎?溪石
并沒有顯示出來,因為定義時@"自定義UILabel\\n 溪石 "
,溪石
前插入了一個換行符\\n
,導致文本被分成了兩行,而UILabel默認只顯示一行,溪石顯示到了第二行,因此看不見!所以需要設置行數:
aLabel.numberOfLines = 0;
這里怎么是零?!我要的是換行,起碼大于1吧!這里當然可以設置1、2、3...表示需要的行數,不過,0表示“無限行”,適用于自動換行等無法確切知道總行數的情形。
接著,還是回到
attributedText
進行設置:
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 8.0;//調整行間距
paragraphStyle.alignment = NSTextAlignmentCenter;
[str addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [str length])];
這里用lineSpacing
屬性設置了行間距,另外又設置了一次對齊屬性alignment
,因為設置文本格式會覆蓋UILabel
的textAlignment
屬性,因此需要重新設置一次。
出發吧!這里只是起點
到這里,UILabel的定制方法基本都已經介紹到了,再來復習一下:
- 自定義字體:介紹了如何使用系統之外的TTF字庫來設置Font。
- 制作不規則的邊框:介紹了用CALayer和CAShapeLayer及貝塞爾路徑來自定義UILabel的邊框,包括形狀與顏色。
- 顯示不同字體和顏色:用
attributedText
屬性代替text
屬性,這樣可以對一段文字分別設定文字的樣式。 - 調整縮進與行距:在
attributedText
的基礎上,利用NSMutableParagraphStyle設置行高等“段落屬性”。
實際上,大家是不是有點兒體會到,UILabel的定制和Word等文本編輯器中的“排版”知識是一致的,在對UI設計越來越重視的軟件開發實踐中,“富文本”排版是不可或缺的知識,剛開始開發iOS的小伙伴,可以以本文中介紹的知識為基礎,進一步了解各個類的屬性,做出多種多樣的文字效果!
【歡迎關注溪石,獲取更多開發技巧】