HeWhoRemains
HeWhoRemains

Reputation: 41

SwiftUI PencilKit Not Updating in Real-Time When Image is Behind Canvas

I’m working on a SwiftUI + PencilKit integration, and I’ve encountered a strange issue. When I place my PKCanvasView inside a ZStack without an image, everything works fine—the drawing updates in real-time as expected. However, when I add an image behind the canvas, real-time updates stop working. Instead:

My Code

import SwiftUI
import PencilKit

struct DrawingView2: UIViewRepresentable {
    @Binding var canvasView: PKCanvasView
    let toolPicker = PKToolPicker()

    func makeUIView(context: Context) -> PKCanvasView {
        canvasView.backgroundColor = .clear
        canvasView.isOpaque = false
        canvasView.isMultipleTouchEnabled = true
        canvasView.allowsFingerDrawing = true
        canvasView.drawingPolicy = .anyInput  // Enables real-time updates

        toolPicker.setVisible(true, forFirstResponder: canvasView)
        toolPicker.addObserver(canvasView)
        canvasView.becomeFirstResponder()

        return canvasView
    }

    func updateUIView(_ uiView: PKCanvasView, context: Context) {
        DispatchQueue.main.async {
            uiView.setNeedsDisplay()  // Forces view to refresh
        }
    }
}

ContentView with an Image Behind the Canvas

struct ContentView2: View {
    @State private var canvasView = PKCanvasView()

    var body: some View {
        ZStack {
            Image("img2")  // Background image

            DrawingView2(canvasView: $canvasView)
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .zIndex(11111)  // High zIndex to ensure visibility
        }
        .edgesIgnoringSafeArea(.all)
    }
}

What I Tried Setting isOpaque = false → No effect. Calling setNeedsDisplay() in updateUIView → No effect. Using .zIndex(1) for the image → No effect. Setting allowsFingerDrawing = true → No effect.

enter image description here

Upvotes: 0

Views: 12

Answers (0)

Related Questions