在 Swift 中使用带属性字符串的最简单方法
这个 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
应用给定的字体。 类型 Font
是 iOS 上的 UIFont
和 macOS 上的 NSFont
的类型别名。
let attributedString = "text".font(.systemFont(ofSize: 12))
应用给定的字体大小。 如果尚未在带属性的字符串上设置任何字体,则将假定为 Font.systemFont
。
注意:与 iOS 不同,在 macOS 上,这将返回一个*可选*的带属性的字符串。
let attributedString = "text".fontSize(12)
应用段落样式,并使用给定的闭包对其进行配置。 如果带属性的字符串已经具有段落样式属性,则在段落样式上调用 configure
闭包; 否则,将使用新的 NSMutableParagraphStyle
。
let attributedString = "Hello World".paragraphStyle {
$0.firstLineHeadIndent = 10
}
应用给定的段落样式。
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.firstLineHeadIndent = 10
let attributedString = "text".paragraphStyle(paragraphStyle)
应用给定的(前景色)颜色。
let attributedString = "text".color(.blue)
应用给定的背景颜色。
let attributedString = "text".backgroundColor(.yellow)
配置是否使用连字。 默认情况下,它们会被使用。
let attributedString = "text".ligature(false)
配置修改默认字距调整的量。 默认值 0
表示不应用字距调整更改。
let attributedString = "text".kern(0.1)
配置删除线样式。 请注意,根据操作系统和版本,并非所有样式都可能实际起作用。
let attributedString = "text".strikeThrough(style: .styleSingle)
配置删除线颜色。 仅设置颜色无效,还必须配置样式。
let attributedString = "text".strikeThrough(color: .red)
同时配置删除线颜色和样式。 请注意,根据操作系统和版本,并非所有样式都可能实际起作用。
let attributedString = "text".strikeThrough(color: .red, style: .styleDouble)
配置下划线样式。 请注意,根据操作系统和版本,并非所有样式都可能实际起作用。
let attributedString = "text".underline(style: .styleSingle)
配置下划线颜色。 仅设置颜色无效,还必须配置样式。
let attributedString = "text".underline(color: .blue)
同时配置下划线颜色和样式。 请注意,根据操作系统和版本,并非所有样式都可能实际起作用。
let attributedString = "text".underline(color: .blue, style: .styleSingle)
配置笔画。
let attributedString = "text".stroke(width: 2, color: .green)
使用接收 NSShadow
实例的闭包配置阴影。 在 watchOS 上不可用。
let result = "Hello World".shadow {
$0.shadowOffset = CGSize(width: 3, height: 3)
$0.shadowBlurRadius = 2
$0.shadowColor = Color.gray
}
通过设置 NSShadow
实例来配置阴影。 在 watchOS 上不可用。
let shadow = NSShadow()
shadow.shadowColor = .green
shadow.shadowBlurRadius = 2
shadow.shadowOffset = 3
let attributedString = "text".shadow(shadow)
添加“字母按下”文本效果。
let attributedString = "text".letterPressed()
使用接收器作为文本创建指向给定 URL 的超链接。
let url = URL(string: "https://example.com")
let attributedString = "text".link(url: url)
使用接收器作为文本创建指向给定 URL 的超链接。
let urlString = "https://example.com"
let attributedString = "text".link(string: urlString)
创建一个新的 NSTextAttachment
并将其传递给 configure
闭包。 在 watchOS 上不可用。
let attributedString = NSAttributedString().attachment {
$0.image = UIImage(...)
$0.bounds = CGRect(...)
}
配置基线偏移。
let attributedString = "text".baselineOffset(-0.5)
配置要应用于字形的倾斜度。
let attributedString = "text".obliqueness(1.5)
配置要应用于字形的扩展。
let attributedString = "text".expansion(2)
上述所有方法都有相应的 getter 来从带属性的字符串中检索属性值。 它们都返回一个可选值; 如果未在带属性的字符串上配置该属性,则将返回 nil
。
getter 为
attachment: NSTextAttachment?
(在 watchOS 上不可用)backgroundColor: Color?
baselineOffset: Float?
color: Color?
expansion: Float?
fontSize: CGFloat?
isLetterPressed: Bool?
kern: Float?
ligature: Bool?
link: NSURL?
obliqueness: Float?
paragraphStyle: NSParagraphStyle?
shadow: NSShadow?
(在 watchOS 上不可用)strikeThroughColor: Color?
strikeThroughStyle: NSUnderlineStyle?
strokeColor: Color?
strokeWidth: Float?
underlineColor: Color?
underlineStyle: NSUnderlineStyle?
您可以使用任何您喜欢的方式使用该库,但两种简单的方法是 Carthage 和 CocoaPods。 对于 CocoaPods,请将 pod RichString
放入您的 Podfile
中。
当我开始时,我发现了一些其他框架,它们的目标与此框架相同:简化使用 NSAttributedString
。 我更喜欢我的,主要是因为它具有更简单的 API,不使用任何其他类型。 但我让你自己选择。 在此之后,我不再对此进行研究,因此这可能已过时。
TextAttributes 类似于此框架,但它引入了一种新类型,您必须设置属性,而不是直接在字符串本身上工作。 它没有像这个框架那样酷的基于闭包的方式来设置 shadow { ... }
和 paragraphStyle { ... }
。 并且它没有提供这个框架提供的超级方便的 +
运算符。 最后,我没有在 tvOS 和 watchOS 上测试此框架。 我相当肯定这些也能工作,但您必须尝试一下。 当然,欢迎提出请求。
TextAttributesUtil 还引入了一种新类型来设置属性。 此外,它的 API 迫使您在源代码中具有更多级别的嵌套。 它仅支持 iOS,不支持 macOS。