iOS 11下使用PDFKit实现点击注释后唤起内嵌浏览器
解决PDFKit中PDFActionURL跳转至内嵌WebView的问题
我之前也碰到过完全一样的困扰!PDFKit默认会把带PDFActionURL的注释按钮跳转直接交给系统Safari处理,确实没什么现成的属性能直接修改这个行为,但我们可以通过拦截PDF动作的处理逻辑来实现用内嵌WebView加载链接的需求。
这里给你一个可行的方案:
- 先让你的ViewController遵循
PDFViewDelegate协议,并且把你的PDFView的delegate设置为当前控制器 - 实现
pdfView(_:shouldHandle:)这个代理方法,在里面拦截PDFActionURL类型的动作,自行处理链接加载,同时阻止系统默认的Safari跳转
代码示例
import UIKit import PDFKit import WebKit class PDFViewController: UIViewController, PDFViewDelegate { @IBOutlet weak var pdfView: PDFView! override func viewDidLoad() { super.viewDidLoad() pdfView.delegate = self // 加载你的PDF文件示例 if let pdfURL = Bundle.main.url(forResource: "sample", withExtension: "pdf") { pdfView.document = PDFDocument(url: pdfURL) } } func pdfView(_ pdfView: PDFView, shouldHandle action: PDFAction) -> Bool { // 只处理URL类型的PDF动作 guard let urlAction = action as? PDFActionURL, let targetURL = urlAction.url else { // 非URL动作交给系统默认处理(比如PDF内部页面跳转) return true } // 创建内嵌WebView并加载目标链接 let webVC = UIViewController() let webView = WKWebView(frame: webVC.view.bounds) webView.autoresizingMask = [.flexibleWidth, .flexibleHeight] webVC.view.addSubview(webView) webView.load(URLRequest(url: targetURL)) // 以模态方式展示WebView控制器(也可以用导航栈push) present(webVC, animated: true) // 返回false,阻止系统打开Safari return false } }
注意事项
- 记得导入
WebKit框架(如果用WKWebView的话),它是苹果现在推荐的WebView方案,替换成UIWebView也可以但不建议 - 这个方法会拦截所有PDF内的URL动作,如果你需要让部分链接保留系统跳转,可以在判断URL时加额外逻辑(比如特定域名的链接才用内嵌WebView)
- 不管你的注释按钮是PDF原有还是自定义添加的,只要关联的是
PDFActionURL,这个拦截逻辑都能生效
内容的提问来源于stack exchange,提问作者Marian König
相关产品推荐
相关产品推荐

