SwiftUI中的PDFView会产生不必要的阴影效果

编程语言 2026-07-11

我想渲染一段内容的预览,稍后在列表中显示。我要能够在后续对预览进行缩放,因此我把预览创建为一个PDFContext,像这样:

func createPDFPreview() -> Data? {

    var mediaBox = CGRect(x: 0, y: absoluteMin, width: width, height: effectiveHeight)
    let pdfData = NSMutableData()
    guard let pdfContext = CGContext(consumer: CGDataConsumer(data: pdfData as CFMutableData)!, mediaBox: &mediaBox,  nil) else {
        return (nil,nil)
    }

    pdfContext.beginPDFPage(nil)

    pdfContext.setFillColor(.white)
    pdfContext.beginPath()
    pdfContext.addRect(mediaBox)
    pdfContext.fillPath()
    pdfContext.setFillColor(CGColor(gray: 0, alpha: 1))

    // some actual drawing

    pdfContext.endPDFPage()
    pdfContext.closePDF()

    return (pdfData as Data)
}

接着我创建一个UIViewRepresentable,如下:

struct PDFKitView: UIViewRepresentable {
    let data: Data

    func makeUIView(context: Context) -> PDFView {
        let pdfView = PDFView()
        pdfView.document = PDFDocument(data: data)
        pdfView.autoScales = false
        pdfView.scaleFactor = 1.0
        pdfView.displayMode = .singlePageContinuous
        pdfView.displayDirection = .vertical
        pdfView.backgroundColor = .clear

        pdfView.layer.shadowOpacity = 0
        pdfView.layer.masksToBounds = true
        pdfView.layer.shadowRadius = 0
        pdfView.layer.shadowOffset = .zero

        pdfView.layer.backgroundColor = UIColor.clear.cgColor
        }

        return pdfView
    }

    func updateUIView(_ uiView: PDFView, context: Context) {}
}

然后这个视图被使用在ListCell中,如下:

public struct TKExerciseListCell: View {

    let exercise: TKExercise

    public var body: some View {
        PDFKitView(data: exercise.pdfPreview!)
    }
}

我的问题是:PDFKitView的边框周围会绘制一个阴影,我无论如何都去不掉。我尝试把shadowRadius设为0,把opacity设为0,在所有可能的位置都尝试过,但均无效。 所有父视图的背景色都设为与PDF使用的颜色相同的白色(.white)。

如何在不产生阴影的情况下绘制此视图,使其边框实际不可见?

解决方案

那个阴影其实是PDF页面的阴影。它的作用是告诉你页面边缘在哪里。

你可以通过下面的方式将其禁用:

pdfView.pageShadowsEnabled = false
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章