73 lines
2.7 KiB
Swift
73 lines
2.7 KiB
Swift
import SwiftUI
|
|
import PDFKit
|
|
|
|
struct LeadPDFView: UIViewRepresentable {
|
|
let url: URL
|
|
var signaturePlacement: PDFSignaturePlacement?
|
|
var fitsWholePage = false
|
|
var onPageChanged: ((Int, Int) -> Void)?
|
|
|
|
func makeUIView(context: Context) -> PDFView {
|
|
let view = PDFView()
|
|
view.displayMode = fitsWholePage ? .singlePage : .singlePageContinuous
|
|
if fitsWholePage {
|
|
view.displayDirection = .horizontal
|
|
view.usePageViewController(true)
|
|
}
|
|
view.autoScales = true
|
|
view.backgroundColor = .secondarySystemGroupedBackground
|
|
context.coordinator.observe(view)
|
|
return view
|
|
}
|
|
|
|
func updateUIView(_ view: PDFView, context: Context) {
|
|
context.coordinator.onPageChanged = onPageChanged
|
|
guard view.document?.documentURL != url else { return }
|
|
view.document = PDFDocument(url: url)
|
|
view.autoScales = true
|
|
if let signaturePlacement,
|
|
let page = view.document?.page(at: signaturePlacement.pageIndex) {
|
|
// The marker exists only in the preview; the signing service reads the original file.
|
|
let marker = PDFAnnotation(bounds: signaturePlacement.bounds, forType: .square, withProperties: nil)
|
|
marker.color = .systemOrange
|
|
marker.interiorColor = UIColor.systemOrange.withAlphaComponent(0.08)
|
|
marker.contents = "Unterschrift Kunde"
|
|
let border = PDFBorder()
|
|
border.lineWidth = 1
|
|
border.style = .dashed
|
|
border.dashPattern = [3, 2]
|
|
marker.border = border
|
|
page.addAnnotation(marker)
|
|
view.go(to: page)
|
|
}
|
|
context.coordinator.report(view)
|
|
}
|
|
|
|
func makeCoordinator() -> Coordinator { Coordinator() }
|
|
|
|
final class Coordinator: NSObject {
|
|
var onPageChanged: ((Int, Int) -> Void)?
|
|
|
|
func observe(_ view: PDFView) {
|
|
NotificationCenter.default.addObserver(
|
|
self, selector: #selector(pageChanged(_:)), name: .PDFViewPageChanged, object: view
|
|
)
|
|
}
|
|
|
|
@objc private func pageChanged(_ notification: Notification) {
|
|
guard let view = notification.object as? PDFView else { return }
|
|
report(view)
|
|
}
|
|
|
|
func report(_ view: PDFView) {
|
|
guard let document = view.document, let page = view.currentPage else { return }
|
|
let number = document.index(for: page) + 1
|
|
let count = document.pageCount
|
|
// Avoid changing SwiftUI state while the representable is updating.
|
|
Task { @MainActor [weak self] in self?.onPageChanged?(number, count) }
|
|
}
|
|
|
|
deinit { NotificationCenter.default.removeObserver(self) }
|
|
}
|
|
}
|