1 year ago

#259871

test-img

PujolDeveloper

Why does PKToolPicker disappear when blur and doesn't come back

When using PKCanvasView and PKToolPicker in a SwiftUI project using Xcode 13, the PKToolPicker disappear when I blur the view, and it doesn't come back when I remove the blur effect.

I am trying to create a popup (to add some setting to the view), but here I simplify the example to just just to see the consequences of the blur effet.

When the blur effect is applied, the PKToolPicker disappear, but when I remove the effect, the PKToolPicker despot come back, so it is still possible to right non the PKCanvasView, but it is not possible to change the Pencil or the color anymore.

Does anyone know how to get the PKToolPicker back?

here is a sample code

import SwiftUI

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @State private var isBlured = false

    var body: some View {
        VStack {
            Button(action: {
                isBlured.toggle()
                print("isBlured \(isBlured)")
            }, label: {
                Image(systemName: "questionmark")
            })
            DrawingView(id: nil, data: nil, title: "test").blur(radius: isBlured ? 30 : 0)
        }.padding()
    }
}

import SwiftUI

struct DrawingView: View {

    @Environment(\.managedObjectContext) var viewContext

    @State var id:UUID?
    @State var data:Data?
    @State var title:String?
    var body: some View {
        VStack{
            DrawingCanvasView(data: data ?? Data(), id: id ?? UUID())
                .environment(\.managedObjectContext, viewContext)
                .navigationBarTitle(title ?? "Untitled",displayMode: .inline)
        }
    }
}

import SwiftUI

struct DrawingCanvasView: UIViewControllerRepresentable {
    @Environment(\.managedObjectContext) private var viewContext

    func updateUIViewController(_ uiViewController: DrawingCanvasViewController,context: Context) {
        uiViewController.drawingData = data
    }
    typealias UIViewControllerType = DrawingCanvasViewController

    var data: Data
    var id: UUID

    func makeUIViewController(context: Context) -> DrawingCanvasViewController {
        let viewController = DrawingCanvasViewController()
        viewController.drawingData = data
        return viewController
    }
}

import UIKit
import PencilKit

class DrawingCanvasViewController: UIViewController, PKToolPickerObserver, PKCanvasViewDelegate {
    lazy var canvas: PKCanvasView = {
        let view = PKCanvasView()
        view.drawingPolicy = .anyInput
        view.minimumZoomScale = 1
        view.maximumZoomScale = 1
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    lazy var toolPicker: PKToolPicker = {
        let toolPicker = PKToolPicker()
        toolPicker.addObserver(self)
        return toolPicker
    }()

    var drawingData = Data()
    var drawingChanged: (Data) -> Void = {_ in}

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(canvas)
        NSLayoutConstraint.activate([
                                        canvas.leadingAnchor.constraint(equalTo: view.leadingAnchor),
                                        canvas.trailingAnchor.constraint(equalTo: view.trailingAnchor),
                                        canvas.topAnchor.constraint(equalTo: view.topAnchor),
                                        canvas.bottomAnchor.constraint(equalTo: view.bottomAnchor)])
        toolPicker.setVisible(true, forFirstResponder: canvas)
        toolPicker.addObserver(canvas)
        canvas.delegate = self
        canvas.becomeFirstResponder()
        if let drawing = try? PKDrawing(data: drawingData){
            canvas.drawing = drawing
        }
    }
}

swiftui

pencilkit

0 Answers

Your Answer

Accepted video resources