转载自:

  • iOS动态字体DynamicType的实现(1)
  • iOS7新特性-dynamic type(动态字体)与font descriptor(字体描述符)

动态字体(Dynamic type)

动态字体是iOS7中新增加的比较重要的特性之一,程序应该按照用户设定的字体大小和粗细来显示文本内容。

分别在设置\通用\辅助功能和设置\通用\文字大小中可以设置文本在应用程序中显示的粗细和大小。

设置UIkit的font属性

iOS7的UIFont提供了一个接口preferredFontForTextStyle:返回一个UIFont的实例,用来设置UIkit的font属性。其参数是一个UIFontTextStyle的NSString对象,有下面六个值:

  • UIFontTextStyleHeadline
  • UIFontTextStyleSubheadline
  • UIFontTextStyleBody
  • UIFontTextStyleFootnote
  • UIFontTextStyleCaption1
  • UIFontTextStyleCaption2

也就是说,我们无需再跟以前一样设置UIKit的font为某个固定的数值(pointSize),而是设置为系统默认的这六个值。如下:

UILabel *textLabel = [[UILabel alloc] init];
textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];

也可以在interface builder中设置:

接收DynamicType的NSNotificationCenter

上一步中我们设置了UILabel的font,但是运行之后在设置里面改变系统的字体大小,发现UILabel并没有变化,这是肯定的,因为你没有在系统字体update之后去update你的font,你的程序只是单纯在初始化的时候设置了一次font是不够,我们需要在系统设置字体大小的时候动态更新我们app的字体。

iOS提供了一个UIContentSizeCategoryDidChangeNotification的消息通知,我们要做的是注册这个消息通知,当接收到通知之后,updata UIlabel的font属性就可以了。

- (id)initWithStyle:(UITableViewStyle)style {if (self = [super initWithStyle:style]) {if (IOS_VERSION >= 7.0) {[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleContentSizeCategoryDidChanged:) name:UIContentSizeCategoryDidChangeNotification object:nil];}}
}
// 回调方法 handleContentSizeCategoryDidChanged:
- (void)handleContentSizeCategoryDidChanged:(NSNotification *)notification
{textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];// 注意这里需要调用setNeedsLayout然后在layoutSubview或者viewDidLayoutSubview里面更新textLabel的frame[self.view setNeedsLayout];
}

参考:

  • iOS 7 Tutorial Series: Dynamic Type

使用Font Descriptors

TextKit中引入的另一个概念是字体描述符。比如,我们有一段文字,我们希望它和我们body的字体是一样的,但是需要粗体显示。在之前的iOS版本中,我们可能需要先知道body中使用的字体是什么,然后找到它的粗体,然后利用fontWithName:size:创建一个font对象。
这样不是很直观,而且引入了dynamic type后,我们常常不知道我们正在使用的是什么字体。字体描述符让这一切变得简单起来。
我们可以这样来做:

UIFontDescriptor *bodyFontDesciptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleBody]; UIFontDescriptor *boldBodyFontDescriptor = [bodyFontDesciptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; self.boldBodyTextLabel.font = [UIFont fontWithDescriptor:boldBodyFontDescriptor size:0.0]; 

首先,我们获取body的文本风格,然后调用 fontDescriptorWithSymbolicTraits: 用来设置字体属性。然后可以利用UIFont的fontWithDescriptor:size: 方法获得需要的字体。

修改 UIFontDescriptor的字体还可以修改为以下值:

  • UIFontDescriptorTraitItalic
  • UIFontDescriptorTraitExpanded
  • UIFontDescriptorTraitCondensed

除了可以修改字体描述符,还可以通过一系列属性找到适合的字体,例如:

UIFontDescriptor *scriptFontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:                                                       @{UIFontDescriptorFamilyAttribute: @"Zapfino",                                                         UIFontDescriptorSizeAttribute: @15.0}                                           ];
self.scriptTextLabel.font = [UIFont fontWithDescriptor:scriptFontDescriptor size:0.0]; 

这里,我们指定了font family和大小。其他可以设置的属性包括:

  • UIFontDescriptorNameAttribute
  • UIFontDescriptorTextStyleAttribute
  • UIFontDescriptorVisbileNameAttribute
  • UIFontDescriptorMatrixAttribute

关于UIFontDescriptor请参考文档Using Text Kit to Draw and Manage Text

动态下载苹果提供的多种中文字体

从iOS6开始,苹果开始支持动态下载官方提供的中文字体到系统中。
请参考:

  • 动态下载苹果提供的多种中文字体
  • 在iOS开发中使用自定义字体

UIFont-动态字体相关推荐

  1. NGUI动态字体教程

    注:此教程仅是用于Unity 4+ 第1 步:导入NGUI 第2 步:导入NGUI_277c_DynamicFonts.unitypackage 如果使用的是ngui2.3.1 或更高的话替换UIFo ...

  2. 制作NGUI动态字体

    不用说NGUI是个牛B又好用的插件,我就不多说了. 在ngui中有两种制做字体的方式,一种是bmfont等工具制作字体图集的方法,这种方法呢是动态的,生成的图集有多个字就是多少个字,要多加一个字要重新 ...

  3. unity_NGUI动态字体制作与字体清晰的几点要素

    1.需要制作动态字体,这样支持字体清晰输出. 2.字体Size必要时需要调大. 3.Keep crisp注意设定为Never. 动态字体制作: 1.添加ttf字体进工程,可以在控制面板里找到. 2.创 ...

  4. NGUI 动态字体边缘模糊,毛边的问题解决办法

    NGUI支持生成动态字体,将ttf格式的字体文件拖入工程,用NGUIFontMaker制作即可,但是制作完之后会发现字体有毛边,边缘模糊. 这时选中你生成的字体预设,在该预设的UIFont脚本上更改P ...

  5. 字体感觉小了 引入的vant_动态字体海报如何设计与制作?

    点击上方蓝字,把我设置为星标☆吧前天,第30期「字体+动效」课开始招收些学生,在报名咨询过程当中,有一部分人表示没接触过AE软件,感觉动态制作与设计很难,担心学不好.为了方便大家理解,我将不久前的一个 ...

  6. 动态设置html字号,html动态字体

    html 动态输出,最全总结:国内几个酷炫的H5特效,js动态输出html语句,html动态字体 html 动态,2017年HTML5行业动态,火速出"鸡"啦!,html动态字体, ...

  7. Unity3d 动态字体

    https://www.xuebuyuan.com/2147872.html Unity3d 动态字体 2014年09月05日 ⁄ 综合 ⁄ 共 2101字 ⁄ 字号 小 中 大 ⁄ 评论关闭 目前测 ...

  8. flutter取消动态字体大小

    如果接触过原生开发的朋友可能知道 最初几年官方推荐使用 sp 作为字体大小的单位,但是事实上经过长时间实践的情况下,大家都开始逐渐使用 dp 作为单位 这样使用者调整系统字体大小,app 中的文字大小 ...

  9. python爬取猫眼遇到动态字体反爬

    前一段时间,爬取了58同城,发现当时的网页对数字有字体反爬虫,然后废了九牛二虎之力找到了规律,终于破解了反爬虫,后来发现猫眼的这个网页虽然使用了字体反爬,但是和原来的58同城还是有很大的差别,后来了解 ...

  10. Unity3D中的动态字体和静态字体

    Unity3D中支持动态字体和静态字体两种格式字体,动态字体即使用TTF格式字体库,静态字体则需要自己打包字体图集.动态字体和静态字体区别在于,动态字体如果出现字体库中不存在的字体,会使用系统字体,而 ...

最新文章

  1. 链表问题14——在单链表种删除指定值的节点
  2. Exists and IN
  3. PHP封装数据库连接
  4. 遍历 List 之效率
  5. 2009年网页设计10大趋势
  6. [学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解
  7. C/C++学校运动会管理系统
  8. Modbus RTU转Modbus TCP网关的应用
  9. 如今表情包的天下,曾经可是颜文字和Emoji的啊...
  10. IBM Websphere CEI Configuration
  11. mysql repeated read_mysql事务之可重复读(Repeated Read)
  12. 魅族4usb计算机连接,魅族MX4如何连接电脑 魅族MX4连接电脑方法
  13. 3D游戏开源引擎分析
  14. Android 利用广播实现黑名单【指定号码】的短信的拦截 附源码下载链接
  15. 华为交换机查看网口光功率命令
  16. 手把手教你用delphi 10.2.3 在windows上编译Centos 7下的命令行程序,适合中小学生
  17. nbu进程的异常造成备份出错
  18. 手机录音 怎么单声道_手机音量太小怎么办?教你一招只需打开这里,进来学学吧...
  19. 【数学建模、美赛】MCM/ICM指南
  20. 10个常用的汇总公式,拿来即用

热门文章

  1. CTF隐写常见套路归纳
  2. 金融风控-贷款违约预测学习笔记(Part3:特征工程)
  3. NetKeeper校园网连接不上,出现Sorry, this application cannot run under a Virtual Machin
  4. 美团、大众点评 token最新算法——宇宙第一简洁版
  5. 实习第一个月体会和总结
  6. Qt 使用QAxObject操作Word
  7. eating的中文意思_Eating是什么意思中文
  8. zh-un电子显示屏优盘发送与设置方法(P10单红)
  9. zzulioj1017C语言答案,郑州轻工业大学oj题解(c语言)1017,1018 if典型题
  10. 20 多个国外优秀Android开源 App