iOS文本佈局探討之二——關於TextKit框架中的字體描述

iOS文本佈局探討之二——關於TextKit框架中的字體描述

1、引言

        UIFont是iOS開發中處理文本字體的類,關於UIFont的相關內容,之前的一篇博客有詳細介紹,本片博客主要介紹關於動態字體的應用與字體描述類NSFontDescriptor的應用。數組

UIFont應用介紹:http://my.oschina.net/u/2340880/blog/397115框架

2、iOS系統中的動態字體

        所謂動態字體,是指在應用使用中,用戶能夠動態調整字體的風格字號等。在iOS7及以後的iOS系統版本,TextKit框架中提供了一個新的類UIFontDescriptor。簡單理解,UIFontDescriptor類是專門用來描述字體的,其中提供了許多方法能夠直接建立出某種字體,也能夠對字體進行設置和調整。動態字體也由這個類來建立。佈局

        在iOS7以後,系統增長了動態字體的功能,當用戶在系統設置中修改字體的屬性或者字號時,不只會影響系統應用的字體,第三方應用的字體也能夠進行相應調整。系統設置字體界面以下:字體

使用UIFontDescriptor類中的以下方法能夠建立動態字體:ui

//建立動態字體的字體描述類實例
+ (UIFontDescriptor *)preferredFontDescriptorWithTextStyle:(NSString *)style;

UIFont類中的以下方法能夠將字體描述類轉換成UIFont字體:spa

+ (UIFont *)fontWithDescriptor:(UIFontDescriptor *)descriptor size:(CGFloat)pointSize NS_AVAILABLE_IOS(7_0);

系統定義了一組動態字體的風格字符創常量,開發者能夠根據需求選用:.net

//標題1
UIKIT_EXTERN NSString *const UIFontTextStyleTitle1 NS_AVAILABLE_IOS(9_0);
//標題2
UIKIT_EXTERN NSString *const UIFontTextStyleTitle2 NS_AVAILABLE_IOS(9_0);
//標題3
UIKIT_EXTERN NSString *const UIFontTextStyleTitle3 NS_AVAILABLE_IOS(9_0);
//大標題
UIKIT_EXTERN NSString *const UIFontTextStyleHeadline NS_AVAILABLE_IOS(7_0);
//子標題
UIKIT_EXTERN NSString *const UIFontTextStyleSubheadline NS_AVAILABLE_IOS(7_0);
//內容
UIKIT_EXTERN NSString *const UIFontTextStyleBody NS_AVAILABLE_IOS(7_0);
//標註
UIKIT_EXTERN NSString *const UIFontTextStyleCallout NS_AVAILABLE_IOS(9_0);
//註腳
UIKIT_EXTERN NSString *const UIFontTextStyleFootnote NS_AVAILABLE_IOS(7_0);
//字幕
UIKIT_EXTERN NSString *const UIFontTextStyleCaption1 NS_AVAILABLE_IOS(7_0);
//字幕2
UIKIT_EXTERN NSString *const UIFontTextStyleCaption2 NS_AVAILABLE_IOS(7_0);

3、關於UIFontDescriptor類

        UIFontDescriptor類能夠直接經過字體名稱來進行建立:code

//經過字體名稱和字號尺寸來進行UIFontDescriptor對象的建立
+ (UIFontDescriptor *)fontDescriptorWithName:(NSString *)fontName size:(CGFloat)size;
//經過字體名稱建立UIFontDescriptor對象,而且設置變換參數
+ (UIFontDescriptor *)fontDescriptorWithName:(NSString *)fontName matrix:(CGAffineTransform)matrix;

CGAffineTransform是一個結構體,其用於文本的控件變換十分強大,在CoreAnimation框架中有CATransform3D這個結構體,CGAffineTransform與其用法十分類似,使其它能夠完成文字的形變,旋轉等。示例以下:orm

//進行旋轉
    CGAffineTransform transfom = CGAffineTransformRotate(CGAffineTransformIdentity, 0.1);
    //進行縱向拉伸
    transfom = CGAffineTransformScale(transfom, 1, 3);
    UIFontDescriptor * fontDes = [UIFontDescriptor fontDescriptorWithName:[UIFont systemFontOfSize:14].fontName matrix:transfom];
    UIFont * font = [UIFont fontWithDescriptor:fontDes size:14];
    UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(20, 100, 280, 400)];
    label.backgroundColor = [UIColor grayColor];
    label.font = font;
    label.numberOfLines = 0;
    label.text = @"Describes a dictionary that fully specifies a font.... UIFontDescriptorInherits From NSObject UIFontDescriptor NSObject UIFontDescriptor Conforms To CVarArgT... 這裏是中文";
    [self.view addSubview:label];

效果以下:對象

開發者也能夠經過配置地點的方式來建立UIFontDescriptor對象:

- (instancetype)initWithFontAttributes:(NSDictionary<NSString *, id> *)attributes;

字典中能夠配置的鍵值以下:

//須要配置爲NSValue值 CGAffineTransform
UIKIT_EXTERN NSString *const UIFontDescriptorMatrixAttribute;
//須要配置爲一個集合set 包含全部字體字符
UIKIT_EXTERN NSString *const UIFontDescriptorCharacterSetAttribute;
//須要配置爲一個數組 數組中爲字體描述對象
UIKIT_EXTERN NSString *const UIFontDescriptorCascadeListAttribute;
//須要配置爲一個字典 其中進行字體特徵的描述 後面會介紹
UIKIT_EXTERN NSString *const UIFontDescriptorTraitsAttribute;
//須要配置爲NSNumber類型的 浮點數 其會影響到字體排版時的字符間距
UIKIT_EXTERN NSString *const UIFontDescriptorFixedAdvanceAttribute;
//須要配置爲一個數組 數組中爲字典 字典中對字型進行配置
/*
//字典中須要配置這兩個鍵
UIKIT_EXTERN NSString *const UIFontFeatureTypeIdentifierKey NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIFontFeatureSelectorIdentifierKey NS_AVAILABLE_IOS(7_0);
*/
UIKIT_EXTERN NSString *const UIFontDescriptorFeatureSettingsAttribute;
//配置字體風格 可用的在前面列舉過
UIKIT_EXTERN NSString *const UIFontDescriptorTextStyleAttribute;

關於字體的特徵藐視,即上面UIFontDescriptorTraitsAttribute鍵值所配置的字典,這個字典中能夠設置的鍵值以下:

//這個鍵值須要配置爲一個NSNumber值,設置文字的渲染特徵 後面會介紹
UIKIT_EXTERN NSString *const UIFontSymbolicTrait;
//設置字體的粗細屬性 
/*
這個鍵能夠設置的值以下
UIKIT_EXTERN const CGFloat UIFontWeightUltraLight NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightThin NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightLight NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightRegular NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightMedium NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightSemibold NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightBold NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightHeavy NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightBlack NS_AVAILABLE_IOS(8_2);
*/
UIKIT_EXTERN NSString *const UIFontWeightTrait;
//設置字體寬度
UIKIT_EXTERN NSString *const UIFontWidthTrait;
//設置字體傾斜
UIKIT_EXTERN NSString *const UIFontSlantTrait;

關於上面UIFontSymbolicTrait鍵值,定義在UIFontDescriptorSymbolicTraits枚舉中,以下:

typedef NS_OPTIONS(uint32_t, UIFontDescriptorSymbolicTraits) {
    UIFontDescriptorTraitItalic = 1u << 0,
    UIFontDescriptorTraitBold = 1u << 1,
    UIFontDescriptorTraitExpanded = 1u << 5,
    UIFontDescriptorTraitCondensed = 1u << 6,
    UIFontDescriptorTraitMonoSpace = 1u << 10, 
    UIFontDescriptorTraitVertical = 1u << 11,
    UIFontDescriptorTraitUIOptimized = 1u << 12, 
    UIFontDescriptorTraitTightLeading = 1u << 15,
    UIFontDescriptorTraitLooseLeading = 1u << 16,
   
    UIFontDescriptorClassMask = 0xF0000000,
    
    UIFontDescriptorClassUnknown = 0u << 28,
    UIFontDescriptorClassOldStyleSerifs = 1u << 28,
    UIFontDescriptorClassTransitionalSerifs = 2u << 28,
    UIFontDescriptorClassModernSerifs = 3u << 28,
    UIFontDescriptorClassClarendonSerifs = 4u << 28,
    UIFontDescriptorClassSlabSerifs = 5u << 28,
    UIFontDescriptorClassFreeformSerifs = 7u << 28,
    UIFontDescriptorClassSansSerif = 8u << 28,
    UIFontDescriptorClassOrnamentals = 9u << 28,
    UIFontDescriptorClassScripts = 10u << 28,
    UIFontDescriptorClassSymbolic = 12u << 28
} NS_ENUM_AVAILABLE_IOS(7_0);

專一技術,熱愛生活,交流技術,也作朋友。

——琿少 QQ羣:203317592

相關文章
相關標籤/搜索