textClipping 是 macOS(源自早期 Mac OS)拖选/拖拽文本生成的一种“剪辑”文件格式:当你在某个 App(如 TextEdit、Safari、Pages……)选中文本,拖到桌面或 Finder 窗口,就会生成 .textClipping 文件。
实现方法
1、Xcode导入GitHub仓库TextClippingKit:https://github.com/dagronf/TextClippingKit
2、TextClippingKit保存方法:
// 字符串生成 TextClipping 格式的数据
let data = try TextClipping.Encode("This is a test")
// 将富文本写入 TextClipping 文件
let ats = NSAttributedString(...)
try TextClipping.Encode(ats, to: ...some file URL...)
使用示例
拖拽到访达并创建富文本内容的TextClipping格式文件的示例:
struct ContentView: View {
let attributed: NSAttributedString = {
let s = NSMutableAttributedString(string: "Hello Clipping!", attributes: [
.font: NSFont.boldSystemFont(ofSize: 18),
.foregroundColor: NSColor.red
])
return s
}()
var body: some View {
Text("Hello Clipping")
.padding()
.background(Color.yellow)
.onDrag {
// 1. 生成 textClipping Data
guard let clipData = try? TextClipping.Encode(attributed) else {
return NSItemProvider()
}
// 2. 写入临时目录
let tempURL = FileManager.default.temporaryDirectory.appendingPathComponent("clip.textClipping")
try? clipData.write(to: tempURL)
// 3. 使用 NSItemProvider 提供文件 URL
return NSItemProvider(contentsOf: tempURL)!
}
}
}
使用TextClipping.Encode方法创建 TextClipping Data数据,将该数据写入到临时目录,使用NSItemProvider(contentsOf:_)方法返回文件URL。
最终的效果是,通过拖拽的形式,保存富文本内容为TextClipping格式文件。
总结
textClipping 本质上是 macOS 的一种剪贴/拖拽历史遗留文件格式,它封装了文本(可能带样式)+ Metadata(metadata / resource fork / multiple representations)。
现代 macOS 很少使用 resource fork,新应用 / 沙盒环境对 resource fork 支持有限 / 不推荐 — 这意味着不能指望以标准 Swift Data API 生成一个完全兼容、在所有 macOS 版本上都能被认作 textClipping 的文件。
对多数现代应用而言,更推荐使用 RTF / HTML /普通文本 /文件 URL 这种方式 — 因为它们有明确 UTI(Uniform Type Identifier)、有标准 API 支持(RTF via NSAttributedString, HTML via Data, etc.),而 textClipping 属于“怪异兼容 / 历史废工”。
参考链接
1、GitHub TextClippingKit:https://github.com/dagronf/TextClippingKit
