[转]UIFont-动态字体

转载自:

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

动态字体(Dynamic type)

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

分别在设置\通用\辅助功能和设置\通用\文字大小中可以设置文本在应用程序中显示的粗细和大小。
[转]UIFont-动态字体_第1张图片

设置UIkit的font属性

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

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

[转]UIFont-动态字体_第2张图片

也就是说,我们无需再跟以前一样设置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开发中使用自定义字体

你可能感兴趣的:(字体,动态,ios7)