天天品尝iOS7甜点 :: Day 12 :: Dynamic Type and Font Descriptors

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


Introduction - 介绍

iOS7中介绍一个高级的有关文本渲染的框架叫做TextKit.TextKit是建立在强大的CoreText上的渲染引擎,并且现在所有的Apple提供的有关文本的组件都是已经更新到TextKit引擎上面了。TextKi添加到iOS中具有很重大的意义,其中一点就是它的动态类型的概念和字体描述符。今天本文将会来看看这些TextKit的新特性。

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

Dynamic Type - 动态类型

动态类型的概念是允许用户指定他们设备中应用程序内部的字体类型有多大。这并不是单单的改变字体大小的能力,而且也概念了其他的类型属性例如字距和行间距。这就确保文本的可读性,因为它可以自动设置不同的类型大小。为了做到这一点,你不需要指定文本类型的字体,而是使用语义表示。也就是不需要指定Helvetica 11pt,你需要把这些类型设置在文本主体中。这就有点类似于HTML中的标签表示,允许用户控制外观。因此,也不需要提前设置字体的大小,在UIFont中有一个新的方法可以用来纠正字体:

1
self.subHeadingLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];

在iOS7中一共有6中不同文本类型:

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

我们可以在代码中进行设置,同时也可以在interface builder进行设置:

当结合了自动布局功能之后,使用动态类型意味着用户可以在应用程序中控制文本的外观。在系统设置页面上面有一个Text Size选项可以允许改变类型的大小:

一个中7种不同类型的字体大小,下面就是展示了它们的一些截图:

在未来的操作系统更新指定的字体有可能会随着操作系统的发展而改变了外观。但是采用了动态类型,你可以确保你的应用程序都可以被访问和匹配操作系统的风格,而且并需要在进一步的做很多的工作。

Font Descriptors - 字体描述符

另一个被TextKit引入的是字体描述符的概念。有许多的地方我们需要考虑字体——我们可以修改字体,而不是完全重新指定一个新的。例如,我们有一些文本,我们希望把它们作为文本的主体设置相同的字体大小,但是我们希望设置为粗体。在之前的iOS版本中我们不得不知道原本文本主体的字体,然后找出设置粗体的等价方法,然后使用fontWithName:size:重新够着一个新字体的对象,然后再次进行设置。

这样的做法并不是十分的直观,介绍了动态类型(dynamic type)之后,我们并不需要总是要知道我们设置的字体的大小。字体描述符(Font descriptors)使用起来十分的简单——一堆有关字体的属性集合,可以通过改变不同的属性来改变字体。例如,如果你你想获得文本主体的粗体字体:

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

首先,我们获得本文主体类型的描述符,然后使用fontDescriptorWithSymbilicTraits:方法,我们可以覆盖一个所谓的字体特征,然后UIFontfontWithDescriptor:size:方法可能被使用来获得需要的字体——并不需要设置大小,所以size:参数设置为0.0,返回的字体大小取决与一开始的字体描述符。

这是一个运用UIFontDescriptor的示例使用字体特征,另外的一些例子如下:

  • UIFontDescriptorTraitItalic
  • UIFontDescriptorTraitExpanded
  • UIFontDescriptorTraitCondensed

使用另外的特性,使用属性有能力指定字体的外观(如衬线的类型),阅读了有关UIFontDescriptorSymbolicTraits的文档可能获得更多的信息。

修改一个已经存在的字体描述符,你可以创建一个属性字典,然后你可以发现字体描述符匹配你需要的效果,例子:

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

在这里我们指定了字体使用了family和size。其他设置的属性可以被使用,如下所示:

  • UIFontDescriptorNameAttribute
  • UIFontDescriptorTextStyleAttribute
  • UIFontDescriptorVisbileNameAttribute
  • UIFontDescriptorMatrixAttribute

此列表不是详尽的——UIFontDescriptor是令人难以置信的强大和带来iOS内联与许多其他文本渲染引擎用在其它地方。

Conclusion - 总结

动态类型是一个非常有用的工具来提高应用程序的外观和可访问性,当结合autolayout它允许用户展示美好的内容和简单易读。字体描述符提供了一个更容易的方式来使用字体——我们更接近这个概念在我们多年的使用文字处理软件中。它应使用字体少了很多的痛苦。我们今天只看到冰山一角——类型呈现是一个复杂的概念,这些新概念iOS和提供更容易访问底层引擎。

本文翻译自:iOS7 Day-by-Day :: Day 12 :: Dynamic Type and Font Descriptors

文章目录
  1. 1. Introduction - 介绍
  2. 2. Dynamic Type - 动态类型
  3. 3. Font Descriptors - 字体描述符
  4. 4. Conclusion - 总结
,