UIFont是iOS開發中處理文本字體的類,關於UIFont的相關內容,之前的一篇博客有詳細介紹,本片博客主要介紹關於動態字體的應用與字體描述類NSFontDescriptor的應用。數組
UIFont應用介紹:http://my.oschina.net/u/2340880/blog/397115。框架
所謂動態字體,是指在應用使用中,用戶能夠動態調整字體的風格字號等。在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);
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