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")
}
}
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")
}
}