🚨V5 现已发布!🚨
Atributika
是一个 Swift 库,通过识别和样式标签、链接、电话号码、标签等,提供了一种简单的方式来从类似 HTML 的文本构建 NSAttributedString
。
AtributikaViews 独立库提供 UILabel/UITextView 的替代品,这些替代品能够显示可高亮和可点击的链接,具有丰富的自定义性和正确的辅助功能支持。
简介
虽然 NSAttributedString 无疑非常强大,但它也是一个需要大量设置工作的低级 API。如果您的字符串是一个模板,而实际内容只有在运行时才知道,这会变得很复杂。在处理本地化时,构建 NSAttributedString 也不那么直接。
但是,Atributika
能解决您的问题!
let b = Attrs().font(.boldSystemFont(ofSize: 20)).foregroundColor(.red)
label.attributedText = "Hello <b>World</b>!!!".style(tags: ["b": b]).attributedString
确实如此,这要简单得多。Atributika
易于使用、声明式、灵活,并且为您处理粗糙的边缘。
功能
Atributika
- NSAttributedString 构建器。
- 使用自定义的快速解析器检测和样式类似 HTML 的 标签。
- 检测和样式 标签 和 提及(即,#something 和 @someone)。
- 识别和样式 链接 和 电话号码。
- 检测和样式正则表达式和 NSDataDetector 模式。
- 样式整个字符串或指定的范围。
- 允许将这些所有结合起来解析复杂的字符串!
- 提供了一个干净且表达丰富的 API 来构建样式。
- 提供了一组独立的检测实用工具,以供独立使用。
- 支持 iOS、tvOS、watchOS 和 macOS。
AtributikaViews
- 带有 高亮和可点击 链接的自定义视图。
- 提供
normal/highlighted/disabled
状态的文本样式。 - 支持自定义高亮。
V5
V5是对项目的重大重构,于2023年初执行。它不完全兼容旧版本,需要一些手动迁移。引入破坏性变更是为了项目进一步发展所必需的。
以下是新功能
NSAttributedString构建
- 完全重写的HTML解析器,解决了大量bug,并改善了边缘情况的处理。
- 更通用和稳健的文本转换和属性微调API。
AttributedLabel / AttributedTextView
- 已移动到独立的库,与Atributika无关。
- 提供适当的辅助功能支持。
- 提高了性能和触摸处理。
- AttributedLabel基于UILabel(轻量级,文本垂直居中)。
- AttributedTextView基于UITextView(支持滚动和文本选择,文本对齐到frame顶部)。
在Demo应用程序中添加了新的示例,包括
- 由AttributedTextView驱动的简易网络浏览器
- SwiftUI集成
- Markdown文档中的可突出显示链接
示例
检测和样式标签,为字符串提供基本样式,不要忘记特殊HTML符号
let redColor = UIColor(red:(0xD0 / 255.0), green: (0x02 / 255.0), blue:(0x1B / 255.0), alpha:1.0)
let a = Attrs().foregroundColor(redColor)
let font = UIFont(name: "AvenirNext-Regular", size: 24)!
let grayColor = UIColor(white: 0x66 / 255.0, alpha: 1)
let base = Attrs().font(font).foregroundColor(grayColor)
let str = "<a><a></a>tributik<a></a></a>"
.style(tags: ["a": a])
.styleBase(base)
.attributedString
检测和样式化标签和提及
let str = "#Hello @World!!!"
.styleHashtags(Attrs().font(.boldSystemFont(ofSize: 45)))
.styleMentions(Attrs().foregroundColor(.red))
.attributedString
检测和样式化链接
let str = "Check this website http://google.com"
.styleLinks(Attrs().foregroundColor(.blue))
.attributedString
检测和样式化电话号码
let str = "Call me (888)555-5512"
.stylePhoneNumbers(Attrs().foregroundColor(.red))
.attributedString
Uber字符串
let links = Attrs().foregroundColor(.blue)
let phoneNumbers = Attrs().backgroundColor(.yellow)
let mentions = Attrs().font(.italicSystemFont(ofSize: 12)).foregroundColor(.black)
let b = Attrs().font(.boldSystemFont(ofSize: 12))
let u = Attrs().underlineStyle(.single)
let base = Attrs().font(.systemFont(ofSize: 12)).foregroundColor(.gray)
let str = "@all I found <u>really</u> nice framework to manage attributed strings. It is called <b>Atributika</b>. Call me if you want to know more (123)456-7890 #swift #nsattributedstring https://github.com/psharanda/Atributika"
.style(tags: ["u": u, "b": b])
.styleMentions(mentions)
.styleHashtags(links)
.styleLinks(links)
.stylePhoneNumbers(phoneNumbers)
.styleBase(base)
.attributedString
属性标签
let tweetLabel = AttributedLabel()
tweetLabel.numberOfLines = 0
tweetLabel.highlightedLinkAttributes = Attrs().foregroundColor(.red).attributes
let baseLinkAttrs = Attrs().foregroundColor(.blue)
let a = TagTuner {
Attrs(baseLinkAttrs).akaLink($0.tag.attributes["href"] ?? "")
}
let hashtag = DetectionTuner {
Attrs(baseLinkAttrs).akaLink("https://twitter.com/hashtag/\($0.text.replacingOccurrences(of: "#", with: ""))")
}
let mention = DetectionTuner {
Attrs(baseLinkAttrs).akaLink("https://twitter.com/\($0.text.replacingOccurrences(of: "@", with: ""))")
}
let link = DetectionTuner {
Attrs(baseLinkAttrs).akaLink($0.text)
}
let tweet = "@all I found <u>really</u> nice framework to manage attributed strings. It is called <b>Atributika</b>. Call me if you want to know more (123)456-7890 #swift #nsattributedstring https://github.com/psharanda/Atributika"
tweetLabel.attributedText = tweet
.style(tags: ["a": a])
.styleHashtags(hashtag)
.styleMentions(mention)
.styleLinks(link)
.attributedString
tweetLabel.onLinkTouchUpInside = { _, val in
if let linkStr = val as? String {
if let url = URL(string: linkStr) {
UIApplication.shared.openURL(url)
}
}
}
view.addSubview(tweetLabel)
需求
当前版本兼容
- Swift 5.0+
- iOS 11.0 或更高版本
- tvOS 11.0 或更高版本
- watchOS 4.0 或更高版本
- macOS 10.13 或更高版本
注意:AttributedLabel
/ AttributedTextView
仅在 iOS 上可用
为什么 Atributika 姓名中有 ‘t’ 这个字母?
因为在白俄罗斯的俄语中,我们有一个 ‘t’ 这个字母(атрыбутыка/атрибутика)。所以基本上它是一个转写,不是一个真正的词。
集成
Swift Package Manager
将依赖项添加到 Package.swift
文件。
dependencies: [
.package(url: "https://github.com/psharanda/Atributika.git", .upToNextMajor(from: "5.0.0"))
]
Carthage
将github "psharanda/Atributika"
添加到您的Cartfile
CocoaPods
Atributika可通过CocoaPods获取。要安装它,请将以下行添加到您的Podfile
pod "Atributika"
pod "AtributikaViews"
手动
- 使用
git submodule add https://github.com/psharanda/Atributika.git
将Atributika添加到项目中作为子模块 - 打开
Atributika
文件夹,并将Atributika.xcodeproj
拖到您的项目树中 - 将
Atributika.framework
添加到目标程序的链接二进制与库
构建阶段 - 使用
import Atributika
导入Atributika,您就可以开始了
许可证
Atributika遵循MIT许可证。请参阅LICENSE文件获取更多信息。