iOS開發基礎:自定義UILabel

題圖

UILabel是一種文本視圖,支持顯示一行或多行的只讀文本,算是大家的常用視圖類,不過雖然用得多,同樣的效果,用了很多不同方法,時間久了,難免有些混淆疑惑,本篇從以下幾個方面做一個歸納總結:

  1. 自定義字體
  2. 制作不規則的邊框
  3. 顯示不同字體和顏色
  4. 調整縮進與行距

如本文題圖這樣的標題,就是使用以上四步編碼出來的,下面將逐步介紹實現它。

1. 自定義字體

iOS9系統里,系統默認的中文字體是“蘋方”,雖然是很優雅的中文字體,不過愛天馬行空的UI設計美眉一定不會滿足,總是愛找“最美”的字體來搭配她們的設計,iOS系統中往往沒有這些字體,這時候怎么辦呢?

步驟一:找到UI效果圖中的字體文件

字體文件術語稱為矢量字庫,一般是以TTF結尾的,你可以請教UI設計美眉:“請問,你這幅效果圖某某位置用的是什么字體呀?”(多好的搭訕機會),比如本文題圖中“自定義”三個字用的是“方正正纖黑”這款字體,這時有經驗的設計美眉一定會把TTF文件傳給你,這里假設就是方正正纖黑.TTF,雙擊該文件用字體冊查看,記錄下顯示的字體名稱FZZhengHeiS-EL-GB,后面會用到。

查看字體名稱

步驟二:將TTF文件導入Xcode工程

拖入TTF文件

注意接下來的導入選項,特別Add to targets千萬不能漏選,否則后面的將導致后面的步驟失?。?br>
導入文件選項

步驟三:在plist文件中添加配置

配置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,因為設置文本格式會覆蓋UILabeltextAlignment屬性,因此需要重新設置一次。

出發吧!這里只是起點

到這里,UILabel的定制方法基本都已經介紹到了,再來復習一下:

  1. 自定義字體:介紹了如何使用系統之外的TTF字庫來設置Font。
  2. 制作不規則的邊框:介紹了用CALayer和CAShapeLayer及貝塞爾路徑來自定義UILabel的邊框,包括形狀與顏色。
  3. 顯示不同字體和顏色:用attributedText屬性代替text屬性,這樣可以對一段文字分別設定文字的樣式。
  4. 調整縮進與行距:在attributedText的基礎上,利用NSMutableParagraphStyle設置行高等“段落屬性”。

實際上,大家是不是有點兒體會到,UILabel的定制和Word等文本編輯器中的“排版”知識是一致的,在對UI設計越來越重視的軟件開發實踐中,“富文本”排版是不可或缺的知識,剛開始開發iOS的小伙伴,可以以本文中介紹的知識為基礎,進一步了解各個類的屬性,做出多種多樣的文字效果!
【歡迎關注溪石,獲取更多開發技巧】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 我還愛你 即使你已經遠去 我的身軀放在燦爛的陽光里 可心靈躲在死寂的黑暗里自憐自已 我還愛你 即使你已經不是原來的...
    眸莘閱讀 259評論 0 1
  • 尋她 春雨菲菲,萬物蘇,一夜梨花凝淚, 無人應無語答。 前路迢迢,夢境尋,兩心相思牽掛, 花落終歸誰家。 小橋流水...
    東方木閱讀 254評論 0 1
  • 悅己者容 《明朝那些事兒》第一部早在三年前就很火了,不過一直沒有關注過。直到最近它的第七部也就是終結篇出來后,發現...
    悅己者容Grace閱讀 473評論 0 4
  • 66七絕:杏花 原創:籬菊傲霜 欲來玄鳥春正旺, 嬌杏忙施粉面妝。 無意春風多愛戀, 紛紛落韻噙幽香。
    籬菊傲霜閱讀 255評論 0 2