下面是一个示例代码,使用UITapGestureRecognizer和PKToolPicker来实现不使用PKCanvasView的情况下使用PKToolPicker。
import UIKit
import PencilKit
class ViewController: UIViewController {
let toolPicker = PKToolPicker()
override func viewDidLoad() {
super.viewDidLoad()
toolPicker.addObserver(self, forKeyPath: "selectedTool", options: [], context: nil)
toolPicker.addObserver(self, forKeyPath: "isVisible", options: [], context: nil)
// 添加一个手势识别器
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture(_:)))
view.addGestureRecognizer(tapGesture)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// 设置toolPicker的相关属性
toolPicker.setVisible(true, forFirstResponder: nil)
toolPicker.addObserver(view, forKeyPath: "color", options: [], context: nil)
toolPicker.addObserver(view, forKeyPath: "drawingPolicy", options: [], context: nil)
}
@objc func handleTapGesture(_ gesture: UITapGestureRecognizer) {
let location = gesture.location(in: view)
if toolPicker.frame.contains(location) {
// 在toolPicker内部点击事件的处理
return
}
// 在toolPicker外部点击事件的处理
if toolPicker.isVisible {
toolPicker.setVisible(false, forFirstResponder: nil)
} else {
toolPicker.setVisible(true, forFirstResponder: nil)
}
}
// 监听toolPicker的属性变化
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "selectedTool" {
if let tool = toolPicker.selectedTool as? PKInkingTool {
// 处理选中的工具变化
print("Selected tool: \(tool)")
}
} else if keyPath == "isVisible" {
if toolPicker.isVisible {
// toolPicker显示
print("Tool picker is visible")
} else {
// toolPicker隐藏
print("Tool picker is hidden")
}
} else if keyPath == "color" {
if let color = toolPicker.color {
// 处理颜色变化
print("Selected color: \(color)")
}
} else if keyPath == "drawingPolicy" {
if let drawingPolicy = toolPicker.drawingPolicy {
// 处理绘制策略变化
print("Drawing policy: \(drawingPolicy)")
}
}
}
deinit {
toolPicker.removeObserver(self, forKeyPath: "selectedTool")
toolPicker.removeObserver(self, forKeyPath: "isVisible")
toolPicker.removeObserver(view, forKeyPath: "color")
toolPicker.removeObserver(view, forKeyPath: "drawingPolicy")
}
}
这个示例代码创建了一个UIViewController,并在其中使用了一个UITapGestureRecognizer来监听手势事件。当点击toolPicker内部时,会处理相关的事件,否则会显示或隐藏toolPicker。通过观察toolPicker的选中工具、可见性、颜色和绘制策略等属性的变化,可以实现对这些属性的处理。