RichString

在 Swift 中使用带属性字符串的最简单方法

Swift Version 4 Percentage Documented Badge CocoaPods Version Badge Supported Platforms Badge Carthage compatible license Build Status

简介

这个 Swift 框架旨在简化使用 NSAttributedString 的过程。它通过扩展您已有的现有类型来实现这一点,而无需添加其他类型,从而确保它与使用 NSAttributedString 的任何其他方法完全互操作。

此框架的核心假设是,您首先配置所有组件,然后将它们连接起来,从而设置带属性的字符串。

它允许你做这样的事情

let title = "This is a title".fontSize(17).color(.blue)
let text = "This is some text".paragraphStyle {
    $0.firstLineHeadIndent = 20
}
let content = title + text

概述

此框架提供以下原语。 有单元测试; 查看它们以获取更多示例。

运算符 + 用于连接带属性的字符串

给定两个字符串,您可以使用 + 运算符将一个附加到另一个

let s1 = NSAttributedString()
let s2 = NSAttributedString()
let concatenated = s1 + s2

用于 StringNSStringNSAttributedStringRichString 协议

font(_:)

应用给定的字体。 类型 Font 是 iOS 上的 UIFont 和 macOS 上的 NSFont 的类型别名。

let attributedString = "text".font(.systemFont(ofSize: 12))

fontSize(_:)

应用给定的字体大小。 如果尚未在带属性的字符串上设置任何字体,则将假定为 Font.systemFont

注意:与 iOS 不同,在 macOS 上,这将返回一个*可选*的带属性的字符串。

let attributedString = "text".fontSize(12)

paragraphStyle(configure:)

应用段落样式,并使用给定的闭包对其进行配置。 如果带属性的字符串已经具有段落样式属性,则在段落样式上调用 configure 闭包; 否则,将使用新的 NSMutableParagraphStyle

let attributedString = "Hello World".paragraphStyle {
    $0.firstLineHeadIndent = 10
}

paragraphStyle(_:)

应用给定的段落样式。

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.firstLineHeadIndent = 10
let attributedString = "text".paragraphStyle(paragraphStyle)

color(_:)

应用给定的(前景色)颜色。

let attributedString = "text".color(.blue)

backgroundColor(_:)

应用给定的背景颜色。

let attributedString = "text".backgroundColor(.yellow)

ligature(_:)

配置是否使用连字。 默认情况下,它们会被使用。

let attributedString = "text".ligature(false)

kern(_:)

配置修改默认字距调整的量。 默认值 0 表示不应用字距调整更改。

let attributedString = "text".kern(0.1)

strikeThrough(style:)

配置删除线样式。 请注意,根据操作系统和版本,并非所有样式都可能实际起作用。

let attributedString = "text".strikeThrough(style: .styleSingle)

strikeThrough(color:)

配置删除线颜色。 仅设置颜色无效,还必须配置样式。

let attributedString = "text".strikeThrough(color: .red)

strikeThrough(color:, style:)

同时配置删除线颜色和样式。 请注意,根据操作系统和版本,并非所有样式都可能实际起作用。

let attributedString = "text".strikeThrough(color: .red, style: .styleDouble)

underline(style:)

配置下划线样式。 请注意,根据操作系统和版本,并非所有样式都可能实际起作用。

let attributedString = "text".underline(style: .styleSingle)

underline(color:)

配置下划线颜色。 仅设置颜色无效,还必须配置样式。

let attributedString = "text".underline(color: .blue)

underline(color:, style:)

同时配置下划线颜色和样式。 请注意,根据操作系统和版本,并非所有样式都可能实际起作用。

let attributedString = "text".underline(color: .blue, style: .styleSingle)

stroke(width:, color:)

配置笔画。

let attributedString = "text".stroke(width: 2, color: .green)

shadow(configure:)

使用接收 NSShadow 实例的闭包配置阴影。 在 watchOS 上不可用。

let result = "Hello World".shadow {
    $0.shadowOffset = CGSize(width: 3, height: 3)
    $0.shadowBlurRadius = 2
    $0.shadowColor = Color.gray
}

shadow(_:)

通过设置 NSShadow 实例来配置阴影。 在 watchOS 上不可用。

let shadow = NSShadow()
shadow.shadowColor = .green
shadow.shadowBlurRadius = 2
shadow.shadowOffset = 3
let attributedString = "text".shadow(shadow)

letterPressed()

添加“字母按下”文本效果。

let attributedString = "text".letterPressed()

link(url:)

使用接收器作为文本创建指向给定 URL 的超链接。

let url = URL(string: "https://example.com")
let attributedString = "text".link(url: url)

link(string:)

使用接收器作为文本创建指向给定 URL 的超链接。

let urlString = "https://example.com"
let attributedString = "text".link(string: urlString)

attachment(configure:)

创建一个新的 NSTextAttachment 并将其传递给 configure 闭包。 在 watchOS 上不可用。

let attributedString = NSAttributedString().attachment {
    $0.image = UIImage(...)
    $0.bounds = CGRect(...)
}

baselineOffset(_:)

配置基线偏移。

let attributedString = "text".baselineOffset(-0.5)

obliqueness(_:)

配置要应用于字形的倾斜度。

let attributedString = "text".obliqueness(1.5)

expansion(_:)

配置要应用于字形的扩展。

let attributedString = "text".expansion(2)

用于获取属性值的 NSAttributedString 扩展

上述所有方法都有相应的 getter 来从带属性的字符串中检索属性值。 它们都返回一个可选值; 如果未在带属性的字符串上配置该属性,则将返回 nil

getter 为

用法

您可以使用任何您喜欢的方式使用该库,但两种简单的方法是 Carthage 和 CocoaPods。 对于 CocoaPods,请将 pod RichString 放入您的 Podfile 中。

替代框架

当我开始时,我发现了一些其他框架,它们的目标与此框架相同:简化使用 NSAttributedString。 我更喜欢我的,主要是因为它具有更简单的 API,不使用任何其他类型。 但我让你自己选择。 在此之后,我不再对此进行研究,因此这可能已过时。

TextAttributes 类似于此框架,但它引入了一种新类型,您必须设置属性,而不是直接在字符串本身上工作。 它没有像这个框架那样酷的基于闭包的方式来设置 shadow { ... }paragraphStyle { ... }。 并且它没有提供这个框架提供的超级方便的 + 运算符。 最后,我没有在 tvOS 和 watchOS 上测试此框架。 我相当肯定这些也能工作,但您必须尝试一下。 当然,欢迎提出请求。

TextAttributesUtil 还引入了一种新类型来设置属性。 此外,它的 API 迫使您在源代码中具有更多级别的嵌套。 它仅支持 iOS,不支持 macOS。