Swift PencilKit、独自PKToolPicker開発

PKCanvasViewにSelectAllを表示したくなかった。
PKToolPickerを使用しない事で表示されないことが分かった為、書くためだけのツールに特化して開発。
PKToolPickerObserverは使用せず、ベタに!?変更する形です。
PencilCaseView.xib

PencilCaseView.swift
import UIKit
import PencilKit
class PencilCaseView: UIView {
var pKCanvasView: PKCanvasView? = nil
let pencilInteraction = UIPencilInteraction()
enum Ink {
case black
case red
case blue
case green
case orange
case purple
case brown
case yellow
}
var selectInk: Ink = .black
var saveInk: Ink = .black
var onPencil = false
var onMarker = false
var onErase = false
@IBOutlet weak var inkBlack: UIButton!
@IBOutlet weak var inkRed: UIButton!
@IBOutlet weak var inkBlue: UIButton!
@IBOutlet weak var inkGreen: UIButton!
@IBOutlet weak var inkOrange: UIButton!
@IBOutlet weak var inkPurple: UIButton!
@IBOutlet weak var inkBrown: UIButton!
@IBOutlet weak var inkYellow: UIButton!
@IBOutlet weak var inkErase: UIButton!
@IBOutlet weak var pencil: UIButton!
@IBOutlet weak var marker: UIButton!
@IBOutlet weak var ruler: UIButton!
override init(frame: CGRect){
super.init(frame: frame)
loadNib()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
loadNib()
}
convenience init(frame: CGRect, pKCanvasView: PKCanvasView) {
self.init(frame: frame)
self.pKCanvasView = pKCanvasView
self.pKCanvasView!.tool = PKInkingTool(.pen, color: .black, width: PKInkingTool.InkType.pen.defaultWidth)
self.inkBlack.backgroundColor = .systemGray5
}
func loadNib(){
let view = Bundle.main.loadNibNamed("PencilCaseView", owner: self, options: nil)?.first as! UIView
view.frame = self.bounds
self.addSubview(view)
self.pencilInteraction.delegate = self
view.addInteraction(self.pencilInteraction)
}
func inkBackground(ink: Ink) {
self.inkBlack.backgroundColor = .clear
self.inkRed.backgroundColor = .clear
self.inkBlue.backgroundColor = .clear
self.inkGreen.backgroundColor = .clear
self.inkOrange.backgroundColor = .clear
self.inkPurple.backgroundColor = .clear
self.inkBrown.backgroundColor = .clear
self.inkYellow.backgroundColor = .clear
self.inkErase.backgroundColor = .clear
switch ink {
case .black:
self.inkBlack.backgroundColor = .systemGray5
case .red:
self.inkRed.backgroundColor = .systemGray5
case .blue:
self.inkBlue.backgroundColor = .systemGray5
case .green:
self.inkGreen.backgroundColor = .systemGray5
case .orange:
self.inkOrange.backgroundColor = .systemGray5
case .purple:
self.inkPurple.backgroundColor = .systemGray5
case .brown:
self.inkBrown.backgroundColor = .systemGray5
case .yellow:
self.inkYellow.backgroundColor = .systemGray5
}
}
@IBAction func tapBlack(_ sender: Any) {
self.inkBackground(ink: .black)
self.updateInk(ink: .black)
}
@IBAction func tapRed(_ sender: Any) {
self.inkBackground(ink: .red)
self.updateInk(ink: .red)
}
@IBAction func tapBlue(_ sender: Any) {
self.inkBackground(ink: .blue)
self.updateInk(ink: .blue)
}
@IBAction func tapGreen(_ sender: Any) {
self.inkBackground(ink: .green)
self.updateInk(ink: .green)
}
@IBAction func tapOrange(_ sender: Any) {
self.inkBackground(ink: .orange)
self.updateInk(ink: .orange)
}
@IBAction func tapPurple(_ sender: Any) {
self.inkBackground(ink: .purple)
self.updateInk(ink: .purple)
}
@IBAction func tapBrown(_ sender: Any) {
self.inkBackground(ink: .brown)
self.updateInk(ink: .brown)
}
@IBAction func tapYellow(_ sender: Any) {
self.inkBackground(ink: .yellow)
self.updateInk(ink: .yellow)
}
@IBAction func tapErase(_ sender: Any) {
self.onErase.toggle()
let color: UIColor = self.onErase ? .blue : .black
self.inkErase.tintColor = color
self.updateInk()
}
@IBAction func tapPencil(_ sender: Any) {
self.onPencil.toggle()
if self.onMarker == true {
self.onMarker = false
self.marker.tintColor = .black
}
let color: UIColor = self.onPencil ? .blue : .black
self.pencil.tintColor = color
self.updateInk()
}
@IBAction func tapMarker(_ sender: Any) {
self.onMarker.toggle()
if self.onPencil == true {
self.onPencil = false
self.pencil.tintColor = .black
}
let color: UIColor = self.onMarker ? .blue : .black
self.marker.tintColor = color
self.updateInk()
}
@IBAction func tapRuler(_ sender: Any) {
self.pKCanvasView?.isRulerActive.toggle()
let color: UIColor = self.pKCanvasView!.isRulerActive ? .blue : .black
self.ruler.tintColor = color
}
func updateInk(ink: Ink? = nil) {
if let ink = ink {
self.saveInk = self.selectInk
self.selectInk = ink
}
if self.onErase == true {
self.pKCanvasView!.tool = PKEraserTool(.vector)
}
else if self.onPencil == true {
self.pKCanvasView!.tool = PKInkingTool(.pencil, color: selectInkToUIColor(), width: PKInkingTool.InkType.pencil.defaultWidth)
}
else if self.onMarker == true {
self.pKCanvasView!.tool = PKInkingTool(.marker, color: selectInkToUIColor(), width: PKInkingTool.InkType.marker.defaultWidth)
}
else {
self.pKCanvasView!.tool = PKInkingTool(.pen, color: selectInkToUIColor(), width: PKInkingTool.InkType.pen.defaultWidth)
}
}
func selectInkToUIColor() -> UIColor {
var result: UIColor = .clear
switch selectInk {
case .black:
result = .black
case .red:
result = .red
case .blue:
result = .blue
case .green:
result = .green
case .orange:
result = .orange
case .purple:
result = .purple
case .brown:
result = .brown
case .yellow:
result = .yellow
}
return result
}
}
extension PencilCaseView: UIPencilInteractionDelegate {
func pencilInteractionDidTap(_ interaction: UIPencilInteraction) {
self.onErase.toggle()
let color: UIColor = self.onErase ? .blue : .black
self.inkErase.tintColor = color
self.updateInk()
}
}






