Swift中如何将UIImage生成的PDF适配到PDFView中?
嘿,这个问题我熟!我来给你捋捋怎么让PDF完美适配PDFView的尺寸~
核心解决方案:利用PDFView内置的自动缩放属性
其实iOS的PDFView已经提供了现成的适配能力,不用手动计算复杂的缩放比例,只需要几个关键设置就能搞定:
1. 开启自动缩放(最关键一步)
设置PDFView的autoScales属性为true,它会自动计算合适的缩放比例,让PDF页面适配视图的宽度(或高度,取决于内容和显示模式),完全不用你自己算数值。
2. 配置显示模式与自适应布局
根据你的需求选择displayMode:
.singlePageContinuous:连续滚动显示单页,适合长内容浏览.singlePage:一次只显示一页,类似电子书的单页阅读模式
同时要确保PDFView能跟随父视图的尺寸变化,比如设置autoresizingMask或者用Auto Layout约束让它铺满父视图,这样旋转屏幕时也能自动适配。
3. 生成PDF时保证页面尺寸合理
如果转出来的PDF页面和图片尺寸不匹配,可能会出现多余空白或拉伸问题,所以生成PDF时尽量用图片的实际尺寸作为PDF页面的尺寸,从源头避免适配隐患。
完整代码示例
结合你提到的imagePickerController选中图片的场景,我给你写一套完整的可运行代码:
第一步:图片转PDF的工具函数
func convertImageToPDF(_ image: UIImage) -> Data? { // 可选:设置PDF元数据 let pdfMeta = [ kCGPDFContextCreator: "你的应用名称", kCGPDFContextAuthor: "开发者名称" ] as CFDictionary // 用图片的实际尺寸创建PDF页面 let imageFrame = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height) let pdfData = NSMutableData() guard let pdfContext = CGContext(pdfData as CFMutableData, mediaBox: &imageFrame, pdfMeta) else { print("创建PDF上下文失败") return nil } // 绘制图片到PDF页面 pdfContext.beginPDFPage(nil) if let cgImage = image.cgImage { pdfContext.draw(cgImage, in: imageFrame) } pdfContext.endPDFPage() pdfContext.closePDF() return pdfData as Data }
第二步:配置并显示适配后的PDFView
func setupAndShowPDFView(with pdfData: Data) { let pdfView = PDFView() // 让PDFView铺满当前ViewController的view(可根据你的布局调整) pdfView.frame = view.bounds pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight] // 核心适配设置 pdfView.autoScales = true pdfView.displayMode = .singlePageContinuous // 按需切换为.singlePage pdfView.pageBreakMargins = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16) // 可选:调整页面边距 // 加载PDF文档 if let pdfDoc = PDFDocument(data: pdfData) { pdfView.document = pdfDoc } view.addSubview(pdfView) }
第三步:在imagePickerController回调中调用
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true) // 获取选中的图片 guard let selectedImage = info[.originalImage] as? UIImage else { print("未获取到选中的图片") return } // 图片转PDF guard let pdfData = convertImageToPDF(selectedImage) else { print("图片转PDF失败") return } // 显示适配后的PDF setupAndShowPDFView(with: pdfData) }
额外注意点
- 如果你的PDFView是用Auto Layout布局的,记得给它添加leading、trailing、top、bottom的约束,绑定到父视图,这样视图大小变化时(比如旋转屏幕)PDFView能自动调整,配合
autoScales实现完美适配。 - 如果后续需要支持多图片转多页PDF,
autoScales依然能生效,每个页面都会自动缩放到适合视图的尺寸。
内容的提问来源于stack exchange,提问作者johnDoe




