iOS開發(fā)基礎(chǔ):自定義UILabel

題圖

UILabel是一種文本視圖,支持顯示一行或多行的只讀文本体斩,算是大家的常用視圖類梭稚,不過雖然用得多,同樣的效果絮吵,用了很多不同方法弧烤,時(shí)間久了,難免有些混淆疑惑源武,本篇從以下幾個(gè)方面做一個(gè)歸納總結(jié):

  1. 自定義字體
  2. 制作不規(guī)則的邊框
  3. 顯示不同字體和顏色
  4. 調(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工程

拖入TTF文件

注意接下來的導(dǎo)入選項(xiàng)梅誓,特別Add to targets千萬不能漏選,否則后面的將導(dǎo)致后面的步驟失敺鹉稀:
導(dǎo)入文件選項(xiàng)

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

配置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屬性將被忽略望忆。

分別設(shè)置字體和顏色

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ì)覆蓋UILabeltextAlignment屬性现柠,因此需要重新設(shè)置一次。

出發(fā)吧弛矛!這里只是起點(diǎn)

到這里够吩,UILabel的定制方法基本都已經(jīng)介紹到了,再來復(fù)習(xí)一下:

  1. 自定義字體:介紹了如何使用系統(tǒng)之外的TTF字庫(kù)來設(shè)置Font汪诉。
  2. 制作不規(guī)則的邊框:介紹了用CALayer和CAShapeLayer及貝塞爾路徑來自定義UILabel的邊框废恋,包括形狀與顏色谈秫。
  3. 顯示不同字體和顏色:用attributedText屬性代替text屬性扒寄,這樣可以對(duì)一段文字分別設(shè)定文字的樣式。
  4. 調(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ā)技巧】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市路捧,隨后出現(xiàn)的幾起案子关霸,更是在濱河造成了極大的恐慌,老刑警劉巖杰扫,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件队寇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡章姓,警方通過查閱死者的電腦和手機(jī)佳遣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啤覆,“玉大人苍日,你說我怎么就攤上這事〈吧” “怎么了相恃?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)笨觅。 經(jīng)常有香客問我拦耐,道長(zhǎng),這世上最難降的妖魔是什么见剩? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任杀糯,我火速辦了婚禮,結(jié)果婚禮上苍苞,老公的妹妹穿的比我還像新娘固翰。我一直安慰自己,他們只是感情好羹呵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布骂际。 她就那樣靜靜地躺著,像睡著了一般冈欢。 火紅的嫁衣襯著肌膚如雪歉铝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天凑耻,我揣著相機(jī)與錄音太示,去河邊找鬼柠贤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛类缤,可吹牛的內(nèi)容都是我干的臼勉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼餐弱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼坚俗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岸裙,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤猖败,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后降允,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恩闻,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年剧董,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幢尚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翅楼,死狀恐怖尉剩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毅臊,我是刑警寧澤理茎,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站管嬉,受9級(jí)特大地震影響皂林,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚯撩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一础倍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胎挎,春花似錦沟启、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至项栏,卻和暖如春浦辨,著一層夾襖步出監(jiān)牢的瞬間蹬竖,已是汗流浹背沼沈。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工流酬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人列另。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓芽腾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親页衙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摊滔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)店乐,斷路器艰躺,智...
    卡卡羅2017閱讀 134,662評(píng)論 18 139
  • 我還愛你 即使你已經(jīng)遠(yuǎn)去 我的身軀放在燦爛的陽光里 可心靈躲在死寂的黑暗里自憐自已 我還愛你 即使你已經(jīng)不是原來的...
    眸莘閱讀 251評(píng)論 0 1
  • 尋她 春雨菲菲,萬物蘇眨八,一夜梨花凝淚腺兴, 無人應(yīng)無語答。 前路迢迢廉侧,夢(mèng)境尋页响,兩心相思牽掛, 花落終歸誰家段誊。 小橋流水...
    東方木閱讀 245評(píng)論 0 1
  • 悅己者容 《明朝那些事兒》第一部早在三年前就很火了闰蚕,不過一直沒有關(guān)注過。直到最近它的第七部也就是終結(jié)篇出來后连舍,發(fā)現(xiàn)...
    悅己者容Grace閱讀 461評(píng)論 0 4
  • 66七絕:杏花 原創(chuàng):籬菊傲霜 欲來玄鳥春正旺没陡, 嬌杏忙施粉面妝。 無意春風(fēng)多愛戀索赏, 紛紛落韻噙幽香诗鸭。
    籬菊傲霜閱讀 248評(píng)論 0 2