DAAttributedStringUtils 0.2

DAAttributedStringUtils 0.2

测试测试
语言语言 Obj-CObjective C
许可 MIT
发布最新发布2014年12月

David Levi维护。




  • David B Levi

作者

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 开始,为字符串中的第一个链接。

请注意,可点击字段只能跨两行文本。如果您创建了一个包含较长的可点击字段的字符串,只有前两行是可点击的。