David B. Levi (https://github.com/dblapps)
DAAttributedStringUtils 是一组简单的工具,用于在 iOS 中处理 NSAttributedString 类。它由三个类组成
DAFontSet - 这是一个处理字体的通用类。主要用于 DAAttributedStringFormatter 类,但仍可独立使用。它提供了将字体转换为斜体版本、非斜体版本或不同权重(即使字体更粗或更细)的机制。
DAAttributedStringFormatter - 该类接受一个包含嵌入格式代码的文本的 NSString 实例,并将其转换为 NSAttributedString 实例。格式代码类似于 printf 风格的格式代码。格式化器还提供了一种指定当使用 DAAttributedLabel 类显示时,字符串中可点击字段的手段。
DAAttributedLabel - 这是一个简单的 UIView 子类,使用 CATextLayer 来显示 NSAttributedString。它会处理将 NSAttributedString 捕获在多行中,并提供了一种方法,可以强制实例调整其框架高度以适应其配置的全部文本。它还支持它所显示的 NSAttributedString 中的可点击字段(使用 DAAttributedStringFormatter 指定字符串中的可点击字段)。DAAttributedLabel 还支持显示 NSAttributedString 的文本背景颜色(这是 CATextLayer 本身无法处理的)。
包含了一个示例 xcode 项目,展示了所有 3 个类的简单用法。
DAAttributeStringUtils 与 iOS4.3、iOS5 和 iOS6 兼容(但是请注意,DAAttributedLabel 中的可点击字段在 iOS4.3 中可能有些不稳定)。
DAAttributedStringUtils 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。
将 DAAttributedStringUtils 目录的内容复制到您的 xcode 项目中。确保将 DAFontSet.plist 文件包含在您的目标文件成员中。
导入您想使用的类的 .h 文件。
将 CoreText 和 QuartzCore 框架添加到您的项目中。
DAFontSet
DAFontSet 用于生成 UIFont 的实例,给定一个字体家族名称或一个现有的 UIFont 实例。给定一个 UIFont 实例,你可以生成与现有实例相对的新实例。例如,你可以生成正体字的斜体版本、更大或更小的点尺寸,或者更粗或更细的版本。基本思想是,你提供字体家族名称或 UIFont 实例,以及所需字体的详细信息,DAFontSet 将推导出适当的 UIFont 实例。
以下是一些初始可用的字体家族名称(你可以添加额外的字体家族,见下文)
Font Family Name Available Weights
---------------- -----------------
Avenir -2 .. 3
TrebuchetMS 0 .. 1
Arial 0 .. 1
Cochin 0 .. 1
Verdana 0 .. 1
Courier 0 .. 1
HoeflerText 0 .. 1
Helvetica -1 .. 1
Optima 0 .. 2
TimesNewRoman 0 .. 1
Baskerville 0 .. 2
AmericanTypewriter -1 .. 1
AmericanTypewriter-Condensed -1 .. 1
AvenirNext -1 .. 4
Georgia 0 .. 1
HelveticaNeue -2 .. 2
GillSans -1 .. 1
Palatino 0 .. 1
CourierNew 0 .. 1
DAFontSet 将可用的字体分为正体和斜体版本,并为每个版本提供了独立的方法。
对于粗体字体,DAFontSet 使用一个权重值。权重为 0 表示正常权重字体。大于 0 的权重值表示不同的粗体字体(数字越大,字体越粗),小于 0 的权重值表示更细的字体。通常,你只会使用权重值为 0 或 1,用于正常或粗体。但一些字体可能有额外的更细或更粗的版本。
例如,你可以像这样创建HelveticaNeue的斜体粗体版本,点尺寸为 24:
UIFont* font1 = [DAFontSet italicFontWithFamily:@"HelveticaNeue" size:24.0f weight:1];
然后你可以生成一个更细的字体版本,如下所示
UIFont* font2 = [DAFontSet changeWeightTo:0 forFont:font1];
或者
UIFont* font3 = [DAFontSet changeWeightBy:-1 forFont:font1];
你还可以生成该字体的正体版本,如下所示
UIFont* font4 = [DAFontSet regularFontForFont:font1];
然后得到该字体的斜体版本
UIFont* font5 = [DAFontSet italicFontForFont:font4];
当然,可用的字体具有不同的权重,如上表所示。另外,并非所有字体都有斜体版本。如果所需权重不可用,DAFontSet 将尝试调整到最接近的可供选择权重,如果斜体版本不可用,将选择正体版本。
要添加额外的字体家族,你必须修改 DAFontSet.plist 属性列表文件。你可以创建该文件的本地副本,并将其原始版本从你的 XCode 项目中删除。
DAFontSet.plist 文件包含一个字体家族的 NSDictionary。你需要向此字典中添加一个新键/值项,其中键值是包含新字体家族名称的 NSString。该值必须是一个 NSDictionary,它包含对字体家族每个可用权重的键/值项。
这些项的键值必须是一个表示字体家族成员权重的值。这些值必须是连续整数。正常权重字体应该有键值为 @"0"。更细的字体应该有递减值的键,所以第一个更细的字体将有一个键值 @"-1"。类似地,更粗的字体应该有递增值的键,所以第一个粗体字体将有键值 @"1"。
每个项的值必须是一个包含两个项目的 NSArray。第一个项目必须是一个包含正常(非斜体)版本字体全名的 NSString,第二个项目必须是一个包含斜体版本字体全名的 NSString。如果没有斜体版本,则使用正常名称作为第二个项目的名称(反之亦然,如果没有正常版本)。
DAAttributedStringFormatter
DAAttributedStringFormatter 将带有嵌入格式化代码的 NSString 实例转换为 NSAttributedString 实例。首先创建一个 DAAttributedStringFormatter 实例,并使用你想要的颜色和字体家族进行配置。然后传递 NSString 实例到格式化器的 formatString: 方法。例如,创建包含一些红色和蓝色文本的字符串,使用Courier和Arial字体
DAAttributedStringFormatter* formatter = [[DAAttributedStringFormatter alloc] init];
formatter.fontFamilies = @[ @"Courier", @"Arial" ];
formatter.colors = @[ [UIColor redColor], [UIColor blueColor] ];
NSAttributedString* attrStr = [formatter formatString:@"%0C%0FRed Courier Text %1C%1FBlue Arial Text %0CRed Arial Text"];
格式化器还具有默认的点尺寸、权重、字体、文本颜色和文本背景颜色。在不存在显式格式化代码的情况下使用它们。初始默认字体是 17 点 Helvetica,默认权重是 0,初始默认文本颜色是黑色,初始默认文本背景颜色是透明。你可以通过 defaultWeight、defaultPointSize、defaultFontFamily、defaultColor 和 defaultBackgroundColor 属性来更改这些设置。
formatter.defaultWeight = 1;
formatter.defaultPointSize = 24.0f;
formatter.defaultFontFamily = @"Georgia";
formatter.defaultColor = [UIColor orangeColor];
formatter.defaultBackgroundColor = [UIColor greenColor];
为了指定在通过 DAAttributedLabel 实例显示的属性字符串中可点击的字段,使用了一对特殊的格式化代码。要创建一个包含可点击字段的字符串,请将字段围在 %L 和 %l 格式化代码的对中。例如
DAAttributedLabel* label = [[DAAttributedLabel alloc] initWithFrame:CGRectMake(10,10,150,25)];
label.text = [formatter formatString:@"Click %LHERE%l to do something!"];
label.delegate = self;
(注意:之前的版本需要使用 linkRanges 数组将关于可点击字段的信息从 DAAttributedStringFormatter 类传递到 DAAttributedLabel 类。这不再是必要的了。)
点击结果标签中的“这里”单词将调用代理方法 label:didSelectLink:。
格式化代码以百分号字符为前缀。要在字符串中放置百分号字符作为文本,请使用 '%%'。否则,格式化器的通用形式为 %xY,其中 x 是一个可选的整数,Y 是指指定要修改的属性的字符。具体代码如下
Code Meaning
---- ----------------------------------------------
%f Set font family to default. This changes the font family only.
%xF Set font family to font family number x from the fontFamilies property array. Numbering starts at 0.
%c Set text color to the default.
%xC Set text color to a color from the colors property array. Numbering starts at 0.
%c Set text background color to the default.
%xC Set text background color to a color from the colors property array. Numbering starts at 0.
%u Turn underlining off.
%xU Set underlining. If x==0, underlining is turned off. If x==1, single underlining is turned on. If x==2, double underlining is turned on.
%xW Set current font weight (see discussion of DAFontSet above).
%w Set current font weight to default weight.
%B Set the font to bold. This sets the font weight to 1.
%b Turn off bold. This sets the font weight to 0.
%I Turn on italics.
%i Turn off italics.
%N Reset the font family, style, underlining, and size to defaults.
%xS Set the font size.
%s Reset to the default font size.
%L Start a clickable field within the string.
%l End a clickable field.
DAAttributedLabel
DAAttributedLabel 是一个简单的 UIView 子类,用于在 CATextLayer 中显示 NSAttributedString。它还可以显示纯 NSString。要使用它,创建一个实例,将文本属性设置为一个 NSString 或 NSAttributedString 的实例,并将其添加到一个子视图中。默认情况下,CATextLayer 会自动换行文本。设置标签的框架后,您可以调用 setPreferredHeight 方法。这将调整标签的高度以容纳整个文本字符串。示例项目显示了如何完成此操作。
DAAttributedLabel 支持它显示的属性字符串中的可点击字段。要使用此功能,您必须使用如上所述的 DAAttributedStringFormatter 类创建一个属性字符串。该类将提供一个 NSArray 实例,必须将其传递给 DAAttributedLabel 的 setText:withLinkRanges: 方法。当用户点击一个字段时,标签的代理将收到一个 label:didSelectLink: 消息。在此消息中发送的 linkNum 值将指示点击了属性字符串中的哪个链接,从 0 开始,为字符串中的第一个链接。
请注意,可点击字段只能跨两行文本。如果您创建了一个包含较长的可点击字段的字符串,只有前两行是可点击的。