YYKit源码探究(九) —— UIFont分类之架构分析和Font Traits(一)

版本记录

版本号 时间
V1.0 2018.03.21

前言

iOS圈内有几个人大家基本都知道,比如说王巍、唐巧,还有YYKit框架的作者现任职于滴滴的郭曜源 - 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分类部分。


架构组成

架构组成如下图所示。

接下来这几篇,我们就围绕这几部分进行说明。


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);

下面我们就看一下输出结果

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

方法实现

下面我们看这个属性的实现。

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

2. @property (nonatomic, readonly) BOOL isItalic

该属性的作用就是判断是否是isItalic字体。

下面就不给出具体示例了,直接给出实现方法。

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

3. @property (nonatomic, readonly) BOOL isMonoSpace

该属性的作用就是判断是否是isMonoSpace字体。

下面就不给出具体示例了,直接给出实现方法。

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

4. @property (nonatomic, readonly) BOOL isColorGlyphs

该属性的作用就是判断是否是isColorGlyphs字体。

下面就不给出具体示例了,直接给出实现方法。

- (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之间进行变化。

下面我们就看方法的实现

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

6. - (nullable UIFont *)fontWithBold

该方法的作用就是返回粗体UIFont对象。

方法实现

下面我们看一下方法实现。

- (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对象。

方法实现

下面我们看一下方法实现。

- (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对象。

方法实现

下面我们看一下方法实现。

- (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对象。

方法实现

下面我们看一下方法实现。

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

后记

本篇我们分析了UIFont的分类的功能,主要介绍了UIFont分类的架构以及第一部分Font Traits的说明,喜欢的给个赞~~~

推荐阅读更多精彩内容