YYKit源碼探究(九) —— UIFont分類之架構(gòu)分析和Font Traits(一)

版本記錄

版本號 時間
V1.0 2018.03.21

前言

iOS圈內(nèi)有幾個人大家基本都知道氓癌,比如說王巍坠狡、唐巧泵三,還有YYKit框架的作者現(xiàn)任職于滴滴的郭曜源 - ibireme等咽安。這里有一篇唐巧對他的專訪伴网,還有他的 GitHub - Yaoyuan博客,這里貼出來框架YYKit 框架妆棒。接下來幾篇我們就一起來看一下這個框架澡腾。感興趣的可以看上面寫的幾篇。
1. YYKit源碼探究(一) —— 基本概覽
2. YYKit源碼探究(二) —— NSString分類之Hash(一)
3. YYKit源碼探究(三) —— NSString分類之Encode and decode(二)
4. YYKit源碼探究(四) —— NSString分類之Drawing(三)
5. YYKit源碼探究(五) —— NSString分類之Regular Expression(四)
6. YYKit源碼探究(六) —— NSString分類之NSNumber Compatible(五)
7. YYKit源碼探究(七) —— NSString分類之Utilities(六)
8. YYKit源碼探究(八) —— NSNumber分類(一)

回顧

上一篇我們分析了NSNumber分類的一些功能糕珊,這一篇我們就看一下UIFont分類部分动分。


架構(gòu)組成

架構(gòu)組成如下圖所示。

接下來這幾篇红选,我們就圍繞這幾部分進(jìn)行說明澜公。


Font Traits API

下面我們看一下這部分的API

@property (nonatomic, readonly) BOOL isBold NS_AVAILABLE_IOS(7_0); ///< Whether the font is bold.
@property (nonatomic, readonly) BOOL isItalic NS_AVAILABLE_IOS(7_0); ///< Whether the font is italic.
@property (nonatomic, readonly) BOOL isMonoSpace NS_AVAILABLE_IOS(7_0); ///< Whether the font is mono space.
@property (nonatomic, readonly) BOOL isColorGlyphs NS_AVAILABLE_IOS(7_0); ///< Whether the font is color glyphs (such as Emoji).
@property (nonatomic, readonly) CGFloat fontWeight NS_AVAILABLE_IOS(7_0); ///< Font weight from -1.0 to 1.0. Regular weight is 0.0.

/**
 Create a bold font from receiver.
 @return A bold font, or nil if failed.
 */
- (nullable UIFont *)fontWithBold NS_AVAILABLE_IOS(7_0);

/**
 Create a italic font from receiver.
 @return A italic font, or nil if failed.
 */
- (nullable UIFont *)fontWithItalic NS_AVAILABLE_IOS(7_0);

/**
 Create a bold and italic font from receiver.
 @return A bold and italic font, or nil if failed.
 */
- (nullable UIFont *)fontWithBoldItalic NS_AVAILABLE_IOS(7_0);

/**
 Create a normal (no bold/italic/...) font from receiver.
 @return A normal font, or nil if failed.
 */
- (nullable UIFont *)fontWithNormal NS_AVAILABLE_IOS(7_0);

1. @property (nonatomic, readonly) BOOL isBold

該屬性的作用就是用來判斷字體是否是粗體。

示例程序

下面我們看一下示例程序喇肋。

UIFont *myFont = [UIFont boldSystemFontOfSize:20.0];
BOOL isBold = myFont.isBold;
NSLog(@"是否是黑體 = %d", isBold);

下面我們就看一下輸出結(jié)果

2018-03-19 18:50:50.992988+0800 JJWebImage[29239:4228882] 是否是黑體 = 1

方法實現(xiàn)

下面我們看這個屬性的實現(xiàn)玛瘸。

- (BOOL)isBold {
    if (![self respondsToSelector:@selector(fontDescriptor)]) return NO;
    return (self.fontDescriptor.symbolicTraits & UIFontDescriptorTraitBold) > 0;
}

2. @property (nonatomic, readonly) BOOL isItalic

該屬性的作用就是判斷是否是isItalic字體蜕青。

下面就不給出具體示例了,直接給出實現(xiàn)方法糊渊。

- (BOOL)isItalic {
    if (![self respondsToSelector:@selector(fontDescriptor)]) return NO;
    return (self.fontDescriptor.symbolicTraits & UIFontDescriptorTraitItalic) > 0;
}

3. @property (nonatomic, readonly) BOOL isMonoSpace

該屬性的作用就是判斷是否是isMonoSpace字體右核。

下面就不給出具體示例了,直接給出實現(xiàn)方法渺绒。

- (BOOL)isMonoSpace {
    if (![self respondsToSelector:@selector(fontDescriptor)]) return NO;
    return (self.fontDescriptor.symbolicTraits & UIFontDescriptorTraitMonoSpace) > 0;
}

4. @property (nonatomic, readonly) BOOL isColorGlyphs

該屬性的作用就是判斷是否是isColorGlyphs字體贺喝。

下面就不給出具體示例了,直接給出實現(xiàn)方法宗兼。

- (BOOL)isColorGlyphs {
    if (![self respondsToSelector:@selector(fontDescriptor)]) return NO;
    return (CTFontGetSymbolicTraits((__bridge CTFontRef)self) & kCTFontTraitColorGlyphs) != 0;
}

5. @property (nonatomic, readonly) CGFloat fontWeight

該屬性的作用就是獲取Font weight的值躏鱼,從-1.0到1.0之間進(jìn)行變化。

下面我們就看方法的實現(xiàn)

- (CGFloat)fontWeight {
    NSDictionary *traits = [self.fontDescriptor objectForKey:UIFontDescriptorTraitsAttribute];
    return [traits[UIFontWeightTrait] floatValue];
}

6. - (nullable UIFont *)fontWithBold

該方法的作用就是返回粗體UIFont對象殷绍。

方法實現(xiàn)

下面我們看一下方法實現(xiàn)染苛。

- (UIFont *)fontWithBold {
    if (![self respondsToSelector:@selector(fontDescriptor)]) return self;
    return [UIFont fontWithDescriptor:[self.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold] size:self.pointSize];
}

7. - (nullable UIFont *)fontWithItalic

該方法的作用就是返回Italic UIFont對象。

方法實現(xiàn)

下面我們看一下方法實現(xiàn)主到。

- (UIFont *)fontWithItalic {
    if (![self respondsToSelector:@selector(fontDescriptor)]) return self;
    return [UIFont fontWithDescriptor:[self.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic] size:self.pointSize];
}

8. - (nullable UIFont *)fontWithBoldItalic

該方法的作用就是返回BoldItalic UIFont對象茶行。

方法實現(xiàn)

下面我們看一下方法實現(xiàn)。

- (UIFont *)fontWithBoldItalic {
    if (![self respondsToSelector:@selector(fontDescriptor)]) return self;
    return [UIFont fontWithDescriptor:[self.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic] size:self.pointSize];
}

9. - (nullable UIFont *)fontWithNormal

該方法的作用就是返回Normal UIFont對象登钥。

方法實現(xiàn)

下面我們看一下方法實現(xiàn)畔师。

- (UIFont *)fontWithNormal {
    if (![self respondsToSelector:@selector(fontDescriptor)]) return self;
    return [UIFont fontWithDescriptor:[self.fontDescriptor fontDescriptorWithSymbolicTraits:0] size:self.pointSize];
}

后記

本篇我們分析了UIFont的分類的功能,主要介紹了UIFont分類的架構(gòu)以及第一部分Font Traits的說明牧牢,喜歡的給個贊~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末看锉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子塔鳍,更是在濱河造成了極大的恐慌伯铣,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轮纫,死亡現(xiàn)場離奇詭異懂傀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蜡感,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蹬蚁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人郑兴,你說我怎么就攤上這事犀斋。” “怎么了情连?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵叽粹,是天一觀的道長。 經(jīng)常有香客問我,道長虫几,這世上最難降的妖魔是什么锤灿? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮辆脸,結(jié)果婚禮上但校,老公的妹妹穿的比我還像新娘。我一直安慰自己啡氢,他們只是感情好状囱,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倘是,像睡著了一般亭枷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搀崭,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天叨粘,我揣著相機(jī)與錄音,去河邊找鬼瘤睹。 笑死升敲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的默蚌。 我是一名探鬼主播冻晤,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼苇羡,長吁一口氣:“原來是場噩夢啊……” “哼绸吸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起设江,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锦茁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叉存,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體码俩,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年歼捏,在試婚紗的時候發(fā)現(xiàn)自己被綠了稿存。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞳秽,死狀恐怖瓣履,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情练俐,我是刑警寧澤袖迎,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響燕锥,放射性物質(zhì)發(fā)生泄漏辜贵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一归形、第九天 我趴在偏房一處隱蔽的房頂上張望托慨。 院中可真熱鬧,春花似錦连霉、人聲如沸榴芳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窟感。三九已至,卻和暖如春歉井,著一層夾襖步出監(jiān)牢的瞬間柿祈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工哩至, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躏嚎,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓菩貌,卻偏偏與公主長得像卢佣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子箭阶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

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