Hello there, I am trying to follow along with the video and copy the example shown here in SwiftUI. I am given the error Cannot assign value of type 'UIView' to type 'PKCanvasView?'
on this line: resultView = overlayView
It is totally possible that I am botching the whole thing up but I would appreciate it if someone looked over my code. Thanks.
code:
// ContentView.swift
import SwiftUI
import PDFKit
import PencilKit
import Foundation
import UIKit
struct PDFUIView: View {
let pdfDoc: PDFDocument
let pdfView: PDFView
init() {
let url = Bundle.main.url(forResource: "example", withExtension: "pdf")!
pdfDoc = PDFDocument(url: url)!
pdfView = PDFView()
}
var body: some View {
VStack {
PDFKitView(showing: pdfDoc, pdfView: pdfView)
}
.padding()
}
}
#Preview {
PDFUIView()
}
struct PDFKitView: UIViewRepresentable {
let pdfDocument: PDFDocument
let pdfView: PDFView
init(showing pdfDoc: PDFDocument, pdfView:PDFView) {
self.pdfDocument = pdfDoc
self.pdfView = pdfView
}
func makeUIView(context: Context) -> PDFView {
pdfView.usePageViewController(true)
pdfView.autoScales = true
pdfView.pageOverlayViewProvider = context.coordinator
pdfView.displayMode = .singlePageContinuous
pdfView.isUserInteractionEnabled = true
pdfView.document = pdfDocument
pdfView.delegate = context.coordinator
return pdfView
}
func updateUIView(_ pdfView: PDFView, context: Context) {
pdfView.document = pdfDocument
}
func makeCoordinator() -> Coordinator {
Coordinator()
}
}
class Coordinator: NSObject, PDFPageOverlayViewProvider, PDFViewDelegate {
var pageToViewMapping = [PDFPage: UIView]()
func pdfView(_ view: PDFView, overlayViewFor page: PDFPage) -> UIView? {
var resultView: PKCanvasView? = nil
if let overlayView = pageToViewMapping[page] {
resultView = overlayView
} else {
var canvasView = PKCanvasView(frame: .zero)
canvasView.drawingPolicy = .anyInput
canvasView.tool = PKInkingTool(.pen, color: .systemCyan, width: 20)
canvasView.backgroundColor = UIColor.clear
pageToViewMapping[page] = canvasView
resultView = canvasView
}
let page = page as! MyPDFPage
if let drawing = page.drawing {
resultView?.drawing = drawing
}
return resultView
}
func pdfView(_ pdfView: PDFView, willDisplayOverlayView overlayView: UIView, for page: PDFPage) {
guard let overlayView = overlayView as? PKCanvasView else {
return
}
guard let canvasView = pageToViewMapping[page] else {
return
}
let page = page as! MyPDFPage
page.drawing = overlayView.drawing
pageToViewMapping.removeValue(forKey: page)
}
class MyPDFAnnotation: PDFAnnotation {
override func draw(with box: PDFDisplayBox, in context: CGContext) {
UIGraphicsPushContext(context)
context.saveGState()
let page = self.page as! MyPDFPage
if let drawing = page.drawing {
let image = drawing.image(from: drawing.bounds, scale: 1)
image.draw(in: drawing.bounds)
}
context.restoreGState()
UIGraphicsPopContext()
}
}
class MyPDFPage: PDFPage {
var drawing: PKDrawing?
}
}