くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

PencilKitを使ってみる

今回はPencilKitについてです

PencilKitとはApple Pencilやユーザーの指からの入力を受け取り、iPadOS、iOSmacOSで表示する画像に変換するiOSアプリケーション用の描画できるSDKです

PencilKitには、線を作成したり、消したり、選択したりするツールが付属しています

簡単な実装で実現できるのでどのように実現させるのかみていきましょう

レイアウト作成

まずはレイアウトを作成します。StoryBoardは次のようにしています

PKCanvasViewを使用して入力をキャプチャします。このオブジェクトは、Apple Pencilや指によるタッチをキャプチャすることができます。

Viewのクラス名をPKCanvasViewに設定するとPKCanvasViewとして認識されます。 また、検索するとPKCanvasViewをStoryBoardで設定せずに、ソースコードで直接PKCanvasViewを生成している記事が多いですが、それでも大丈夫です

imageViewを配置しているのは画像の上で入力できるようにするためです

キャンバスとパレットの設定

レイアウトを作成したら入力できるように設定します

PKCanvasViewはレイアウトの設定を行ったので、入力エリアは設定できています。 あとは、PKToolPickerという色やペンの種類を変更するためのパレットを表示させる設定を行います

class PencilKitViewController: UIViewController {
    @IBOutlet private weak var pencilKit: PKCanvasView!
    
    private let pkToolPicker = PKToolPicker()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // CanvasViewで入力ができるようにする       
        pencilKit.tool = PKInkingTool(.pen, color: .black, width: 30)
        if #available(iOS 14.0, *) {
            pencilKit.drawingPolicy = .anyInput
        }
        
        // CanvasViewの下の画像が表示できるようにCanvasViewを透明にする
        pencilKit.isOpaque = true
        pencilKit.backgroundColor = .clear

        pencilKit.becomeFirstResponder()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        if let pencilKit = pencilKit {
            pkToolPicker.setVisible(true, forFirstResponder: pencilKit)
            pkToolPicker.addObserver(pencilKit)
        }
    }
}

pencilKit.drawingPolicy = .anyInputApple Pencilだけでなく手でも入力できるようにしています。drawingPolicyはiOS14以降で設定できるため注意してください

基本的には上記ソースコードにコメントを記載しています。ただ、「CanvasViewの下の画像が表示できるようにCanvasViewを透明にする」というのは画像が下にあって入力できるようにするために必要なので、 お絵描きをするためだけであればなくてもいい処理になります

画像の上にCanvasViewを表示させる

また、ツールパレットを表示させる処理はviewDidAppearで行わないと表示されないので注意が必要です

入力したデータを変換する

PKCanvasViewで入力したデータをUIImageに変換することができます

次のように、PKDrawing.imageでUIImageを取得します

let image = pencilKit.drawing.image(from: pencilKit.bounds, scale: 1.0)

UIImage として取得したいPKCanvasViewの範囲をfromに指定して、画像の拡大率をscaleに指定します

上記の方法でUIImageを取得できます

最後に

お絵描きアプリなど作成する場合には湯買うことになると思いますが、短いコードで実現できるので導入しやすいと思います

細かい情報はWWDCなどの映像や公式ドキュメントで確認できるので調べてみるのをおススメします!

参照

developer.apple.com

developer.apple.com