如何在iOS Swift中构建字体生成器并支持带样式复制到剪贴板
实现带字体样式复制的核心逻辑
你之前使用UIPasteboard.general.string只能写入纯文本,本身不携带任何样式属性,所以粘贴后只会保留文字内容。要实现跨应用带样式粘贴,需要将内容转成通用的富文本格式(RTF)写入剪贴板,具体实现步骤如下:
1. 导入依赖框架
iOS 14及以上推荐用系统新的统一类型识别框架,低于14的版本可以用MobileCoreServices:
import UIKit import UniformTypeIdentifiers // iOS14+ 用这个 // import MobileCoreServices // iOS14以下用这个
2. 构造带自定义字体的富文本
先把要复制的内容封装成带字体属性的NSAttributedString:
// 你定义的字体列表 let fonts: [String] = ["BodoniSvtyTwoOSITCTT-Book", "ChalkboardSE-Regular"] // 要复制的文本内容 let targetText = "需要复制的测试文本" // 选中要使用的字体,做兜底判断避免字体加载失败 guard let selectedFont = UIFont(name: fonts[1], size: 16) else { return } // 生成带字体样式的富文本 let attributedText = NSAttributedString( string: targetText, attributes: [.font: selectedFont] )
3. 转RTF格式写入剪贴板
把富文本转成跨应用通用的RTF数据,写入系统剪贴板:
do { // 富文本转RTF数据 let rtfData = try attributedText.data( from: NSRange(location: 0, length: attributedText.length), documentAttributes: [.documentType: NSAttributedString.DocumentType.rtf] ) // 将RTF数据写入剪贴板,指定对应类型让其他应用可识别 UIPasteboard.general.setData( rtfData, forPasteboardType: UTType.rtf.identifier // iOS14+写法 // forPasteboardType: kUTTypeRTF as String // iOS14以下写法 ) // 可选:同时写入纯文本,兼容不支持富文本的输入场景 UIPasteboard.general.string = targetText } catch { print("样式转换失败:\(error)") }
额外注意事项
- 你用到的自定义字体需要提前在项目
Info.plist的Fonts provided by application项中完成注册,否则UIFont(name:)会返回nil,样式无法生效 - 如果需要实现文本选中功能,直接使用
UITextView即可,把isEditable设为false、isSelectable设为true,系统自带选中复制能力,也可以自定义复制按钮触发上述逻辑 - 该方案兼容所有支持富文本粘贴的应用,包括备忘录、社交平台发帖框等,如果目标应用只支持纯文本,会自动读取你同时写入的纯文本内容,不会影响使用
内容的提问来源于stack exchange,提问作者21.kaw
相关产品推荐
相关产品推荐

