如何将Core Graphics相关的Objective-C PDF链接绘制代码转为Swift?
没问题,我来帮你把这段Objective-C的PDF链接绘制代码转换成正确的Swift版本,顺便解释关键的转换细节,帮你理解每一步的作用:
转换后的Swift代码(适配PDF可点击链接绘制)
这是完整的、功能与原Objective-C代码完全一致的Swift实现:
func drawTextLink(text: String, frameRect: CGRect) { guard let context = UIGraphicsGetCurrentContext() else { // 安全判断:获取不到上下文时直接返回,避免崩溃 return } // 处理PDF与UIKit的坐标系差异 var ctm = context.ctm // 平移原点到PDF页面左下角(原代码中842为PDF页面高度,保留原数值) ctm = ctm.translatedBy(x: 0.0, y: 842) // 翻转坐标系,恢复PDF的右手坐标系规则 ctm = ctm.scaledBy(x: 1.0, y: -1.0) // 将传入的UIKit坐标系frame转换为PDF坐标系下的矩形 let xformRect = frameRect.applying(ctm) // 校验URL合法性 guard let url = URL(string: text) else { return } // 设置PDF的可点击链接区域 UIGraphicsSetPDFContextURLForRect(url, xformRect) // 保存当前上下文状态,绘制完成后恢复 context.saveGState() // 创建富文本属性:蓝色字体+单下划线 let attributes: [NSAttributedString.Key: Any] = [ .underlineStyle: NSUnderlineStyle.single.rawValue, .foregroundColor: UIColor.blue ] let attString = NSAttributedString(string: url.absoluteString, attributes: attributes) // 在指定区域绘制富文本 attString.draw(in: frameRect) // 恢复之前保存的上下文状态 context.restoreGState() }
针对你之前尝试的错误修正说明
- 上下文安全处理:Swift中用
guard let替代OC的直接强制使用,避免因上下文为空导致崩溃,这是Swift安全编程的常用做法。 - 仿射变换的正确操作:Swift里的
CGAffineTransform是不可变对象,每次变换都需要重新赋值(比如ctm = ctm.translatedBy(...)),而不是像OC那样直接修改原变换,这是你之前代码出错的核心原因。 - 类型适配:原OC的
NSString在Swift中直接用String即可,NSURL对应Swift的URL,类型转换更自然简洁。 - 富文本属性写法:Swift使用
NSAttributedString.Key替代OC的字符串常量,NSUnderlineStyle枚举需要传入rawValue才能正确赋值给属性。 - 可选值校验:增加了URL合法性判断,避免传入无效文本时出现后续错误。
内容的提问来源于stack exchange,提问作者Jap
相关产品推荐
相关产品推荐

