You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:54:42