iOS文本布局探讨之二——关于TextKit框架中的字体描述

简介: iOS文本布局探讨之二——关于TextKit框架中的字体描述

一、引言


       UIFont是iOS开发中处理文本字体的类,关于UIFont的相关内容,以前的一篇博客有详细介绍,本片博客主要介绍关于动态字体的应用与字体描述类NSFontDescriptor的应用。


UIFont应用介绍:http://my.oschina.net/u/2340880/blog/397115


二、iOS系统中的动态字体


       所谓动态字体,是指在应用使用中,用户可以动态调整字体的风格字号等。在iOS7及之后的iOS系统版本,TextKit框架中提供了一个新的类UIFontDescriptor。简单理解,UIFontDescriptor类是专门用来描述字体的,其中提供了许多方法可以直接创建出某种字体,也可以对字体进行设置和调整。动态字体也由这个类来创建。


       在iOS7之后,系统增加了动态字体的功能,当用户在系统设置中修改字体的属性或者字号时,不仅会影响系统应用的字体,第三方应用的字体也可以进行相应调整。系统设置字体界面如下:


image.png


使用UIFontDescriptor类中的如下方法可以创建动态字体:


//创建动态字体的字体描述类实例

+ (UIFontDescriptor *)preferredFontDescriptorWithTextStyle:(NSString *)style;

UIFont类中的如下方法可以将字体描述类转换成UIFont字体:


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

系统定义了一组动态字体的风格字符创常量,开发者可以根据需求选用:


//标题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类


       UIFontDescriptor类可以直接通过字体名称来进行创建:


//通过字体名称和字号尺寸来进行UIFontDescriptor对象的创建

+ (UIFontDescriptor *)fontDescriptorWithName:(NSString *)fontName size:(CGFloat)size;

//通过字体名称创建UIFontDescriptor对象,并且设置变换参数

+ (UIFontDescriptor *)fontDescriptorWithName:(NSString *)fontName matrix:(CGAffineTransform)matrix;

CGAffineTransform是一个结构体,其用于文本的控件变换十分强大,在CoreAnimation框架中有CATransform3D这个结构体,CGAffineTransform与其用法十分相似,使其它可以完成文字的形变,旋转等。示例如下:


   //进行旋转

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

效果如下:

image.png



开发者也可以通过配置地点的方式来创建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);一、引言


       UIFont是iOS开发中处理文本字体的类,关于UIFont的相关内容,以前的一篇博客有详细介绍,本片博客主要介绍关于动态字体的应用与字体描述类NSFontDescriptor的应用。


UIFont应用介绍:http://my.oschina.net/u/2340880/blog/397115


二、iOS系统中的动态字体


       所谓动态字体,是指在应用使用中,用户可以动态调整字体的风格字号等。在iOS7及之后的iOS系统版本,TextKit框架中提供了一个新的类UIFontDescriptor。简单理解,UIFontDescriptor类是专门用来描述字体的,其中提供了许多方法可以直接创建出某种字体,也可以对字体进行设置和调整。动态字体也由这个类来创建。


       在iOS7之后,系统增加了动态字体的功能,当用户在系统设置中修改字体的属性或者字号时,不仅会影响系统应用的字体,第三方应用的字体也可以进行相应调整。系统设置字体界面如下:




使用UIFontDescriptor类中的如下方法可以创建动态字体:


//创建动态字体的字体描述类实例

+ (UIFontDescriptor *)preferredFontDescriptorWithTextStyle:(NSString *)style;

UIFont类中的如下方法可以将字体描述类转换成UIFont字体:


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

系统定义了一组动态字体的风格字符创常量,开发者可以根据需求选用:


//标题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类


       UIFontDescriptor类可以直接通过字体名称来进行创建:


//通过字体名称和字号尺寸来进行UIFontDescriptor对象的创建

+ (UIFontDescriptor *)fontDescriptorWithName:(NSString *)fontName size:(CGFloat)size;

//通过字体名称创建UIFontDescriptor对象,并且设置变换参数

+ (UIFontDescriptor *)fontDescriptorWithName:(NSString *)fontName matrix:(CGAffineTransform)matrix;

CGAffineTransform是一个结构体,其用于文本的控件变换十分强大,在CoreAnimation框架中有CATransform3D这个结构体,CGAffineTransform与其用法十分相似,使其它可以完成文字的形变,旋转等。示例如下:


   //进行旋转

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

目录
相关文章
|
7天前
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
121 60
|
3月前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
4月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台框架解析
在移动应用开发的广阔舞台上,安卓和iOS一直是两大主角。随着技术的进步,开发者们渴望能有一种方式,让他们的应用能同时在这两大平台上运行,而不必为每一个平台单独编写代码。这就是跨平台框架诞生的背景。本文将探讨几种流行的跨平台框架,包括它们的优势、局限性,以及如何根据项目需求选择合适的框架。我们将从技术的深度和广度两个维度,对这些框架进行比较分析,旨在为开发者提供一个清晰的指南,帮助他们在安卓和iOS的开发旅程中,做出明智的选择。
|
7天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
27天前
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.1版已发布
RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题
55 5
|
25天前
|
Swift iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】在苹果生态系统中,SwiftUI的引入无疑为iOS应用开发带来了革命性的变化。本文将通过深入浅出的方式,带领读者了解SwiftUI的基本概念、核心优势以及如何在实际项目中运用这一框架。我们将从一个简单的例子开始,逐步深入到更复杂的应用场景,让初学者能够快速上手,同时也为有经验的开发者提供一些深度使用的技巧和策略。
45 1
|
3月前
|
机器学习/深度学习 搜索推荐 数据处理
探索iOS应用开发的新趋势:SwiftUI和Combine框架
【8月更文挑战第6天】随着Apple不断推动其操作系统的进化,iOS开发领域也迎来了新的变革。本文将深入探讨SwiftUI和Combine框架如何革新iOS应用开发流程,提升开发者的工作效率,并改善最终用户的体验。我们将从这两个框架的基本概念出发,分析它们的核心优势,并预测它们将如何塑造iOS开发的未来。
|
2月前
|
iOS开发 开发者 UED
探索iOS应用开发中的SwiftUI框架
【9月更文挑战第26天】 在iOS开发的海洋中,SwiftUI犹如一艘现代的快艇,引领着开发者们驶向更加高效与直观的编程体验。本文将带你领略SwiftUI的魅力,从其设计理念到实际应用,我们将一步步揭开它如何简化界面构建过程的面纱。通过对比传统方式,你将看到SwiftUI如何让代码变得像诗一样优美,同时保持强大的功能性和灵活性。准备好让你的iOS开发技能加速升级,一起驾驭这股新潮流吧!
|
2月前
|
前端开发 iOS开发 开发者
探索iOS开发中的SwiftUI框架
【9月更文挑战第21天】在iOS应用开发的广阔天地中,SwiftUI框架如一股清新之风,为开发者带来了声明式语法的便捷与高效。本文将深入探讨SwiftUI的核心概念、布局方式及数据绑定机制,同时通过实例演示如何运用SwiftUI构建用户界面,旨在引领读者领略SwiftUI的魅力,并激发其对iOS开发新趋势的思考与实践。
43 6
|
2月前
|
安全 iOS开发
iOS页面布局:UIScrollView的布局问题
iOS页面布局:UIScrollView的布局问题
62 8