Search code examples
iosswiftpencilkit

How can I fix pencilKit toolbar?


I am trying to make a drawing app for IOS 15.5 using pencilKit. I can draw on screen but when i want to change tool using toolPicker it is not actually changing(it keeps drawing with default one) here is my code

import UIKit
import PencilKit
class ViewController: UIViewController, PKCanvasViewDelegate, PKToolPickerObserver{
    @IBOutlet weak var canvasView: PKCanvasView!
    override func viewDidLoad() {
        super.viewDidLoad()
        canvasView.delegate = self
        canvasView.becomeFirstResponder()
    }
    override func viewDidAppear(_ animated:  Bool) {
        super.viewDidAppear(true)
        canvasView.drawingPolicy = .anyInput
        setUpCanvasView()
    }
    func setUpCanvasView(){
        let toolPicker = PKToolPicker.init()
        toolPicker.addObserver(canvasView)
        toolPicker.setVisible(true, forFirstResponder: canvasView)
        canvasView.becomeFirstResponder()
    }
        func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
            print("drawing")
        }
        
        func canvasViewDidEndUsingTool(_ canvasView: PKCanvasView) {
            print("End using the PK tools")
        }
        
        func canvasViewDidFinishRendering(_ canvasView: PKCanvasView) {
            print("Completed the UI Event")
        }
        
    }

Solution

  • The problem here is, that you are creating a PKToolPicker instance in a function and after the functions ends, the instance gets deallocated from the memory. Do it likes this and it should work.

    import UIKit
    import PencilKit
    
    class ViewController: UIViewController, PKCanvasViewDelegate, PKToolPickerObserver {
    
    @IBOutlet weak var canvasView: PKCanvasView!
    let toolPicker = PKToolPicker()
    
       override func viewDidLoad() {
         super.viewDidLoad()
         canvasView.delegate = self
         canvasView.becomeFirstResponder()
        }
    
        override func viewDidAppear(_ animated:  Bool) {
          super.viewDidAppear(true)
          canvasView.drawingPolicy = .anyInput
          setUpCanvasView()
        }
    
        func setUpCanvasView(){
           toolPicker.addObserver(canvasView)
           toolPicker.setVisible(true, forFirstResponder: canvasView)
           canvasView.becomeFirstResponder()
        }
    
        func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
            print("drawing")
        }
        
        func canvasViewDidEndUsingTool(_ canvasView: PKCanvasView) {
            print("End using the PK tools")
        }
        
        func canvasViewDidFinishRendering(_ canvasView: PKCanvasView) {
            print("Completed the UI Event")
        }
        
    }