iOS集合视图PDF首页预览显示黑块问题及代码求助
解决PDF预览图显示黑块的问题
嘿,我帮你搞定这个PDF预览黑块的问题!你的代码其实已经离正确结果很近了,问题主要出在没有给渲染上下文设置白色背景,再加上一些可选值的安全处理,就能完美解决啦。
问题根源
你注释掉了UIColor.white.set()和cnv.fill(pageRect!)这两行——而UIGraphicsImageRenderer的默认上下文背景是黑色的。大部分PDF页面的内容是白色,但如果不预先填充白色背景,渲染出来的图像就会显示成黑块(尤其是当PDF有透明区域时)。另外,你代码里直接强制解包了好几个可选值,这很容易导致崩溃,得补上安全判断。
修复后的完整代码
func displayContent(document: DocumentModel) { // 先安全拿到PDF文件的URL,找不到就直接返回 guard let pdfURL = Bundle.main.url(forResource: document.title, withExtension: ".pdf") else { print("找不到目标PDF文件:\(document.title)") return } // 安全加载PDF文档和第一页 guard let pdf = CGPDFDocument(pdfURL as CFURL), let pdfPage = pdf.page(at: 1) else { print("加载PDF页面失败") return } let pageRect = pdfPage.getBoxRect(.mediaBox) // 设置渲染格式,直接指定白色背景(比手动填充更省心) let rendererFormat = UIGraphicsImageRendererFormat() rendererFormat.backgroundColor = UIColor.white.cgColor let renderer = UIGraphicsImageRenderer(size: pageRect.size, format: rendererFormat) let imageData = renderer.jpegData(withCompressionQuality: 0.5) { context in // 坐标系转换:CGPDF的原点在左下角,UIKit在左上角,必须调整 context.cgContext.translateBy(x: 0.0, y: pageRect.size.height) context.cgContext.scaleBy(x: 1.0, y: -1.0) // 绘制PDF页面 context.cgContext.drawPDFPage(pdfPage) } self.previewImage.contentMode = .scaleAspectFit self.previewImage.clipsToBounds = true self.previewImage.image = UIImage(data: imageData) self.documentTitle.text = document.title }
几个关键修改说明
- 白色背景设置:用
UIGraphicsImageRendererFormat直接指定背景色,比手动填充更可靠,还少写两行代码 - 可选值安全处理:用
guard let替代强制解包,避免因为文件丢失、PDF损坏等情况导致崩溃 - 保留了正确的坐标系转换:这一步是必须的,不然PDF会上下颠倒显示
这样改完之后,你就能看到正常的PDF第一页预览图了,再也不会是黑块啦!
内容的提问来源于stack exchange,提问作者moaster
相关产品推荐
相关产品推荐

