質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

0回答

1230閲覧

【SwiftUI】PKCanvasView.toolの変更を検知したい【PencilKit】

taichi_dm_

総合スコア60

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/08/10 09:54

現在、SwiftUIとPencilKitを用いてアプリを制作しております。

#やりたいこと
PKToolPickerを使わずに、PKCanvasView.toolを変更し(ここまでできた)、
PKCanvasView.toolの状態をみて、どのツールを使っているかを表示したい(できていない)

###環境
・MacOS: 10.15.5
・Xcode: 11.6
・iOS: 13.6
・Swift5.2

###ソースコード

問題が再現できるソースコードを用意しました。

この状態で実行すると、
画面左側にApplePencil or 指で描画できるキャンバス
画面右側にPKCanvasView.toolのツールを切り替えるボタンと、その下に現在のツールを表示するText()が現れます。

ボタンを押すと、PKCanvasView.toolのツールが切り替わったのが確認できました。
しかし、現在のツールを表示するText()が更新されません。

Swift

1import SwiftUI 2import PencilKit 3 4struct ContentView: View { 5 @State private var canvasView: PKCanvasView = .init() 6 var body: some View { 7 ZStack { 8 CanvasViewRepresentable(canvasView: self.$canvasView) 9 HStack { 10 Spacer() 11 VStack { 12 Button(action: { 13 if self.canvasView.tool as? PKInkingTool != nil { 14 self.canvasView.tool = PKEraserTool(.vector) 15 } else { 16 self.canvasView.tool = PKInkingTool(.marker) 17 } 18 }) { 19 Text("Toggle Tool") 20 } 21 if self.canvasView.tool as? PKInkingTool != nil { 22 Text("InkingTool") 23 } else if self.canvasView.tool as? PKEraserTool != nil { 24 Text("EraserTool") 25 } 26 } 27 } 28 } 29 } 30} 31 32struct CanvasViewRepresentable: UIViewRepresentable { 33 @Binding var canvasView: PKCanvasView 34 35 func makeUIView(context: Context) -> PKCanvasView { 36 self.canvasView.tool = PKInkingTool(.pen, color: .black, width: 15) 37 self.canvasView.isOpaque = false 38 39 // 標準のPKToolPickerは使わず、自力でToolを変更したいです。 40 /*if let window = UIApplication.shared.windows.first { 41 if let toolPicker = PKToolPicker.shared(for: window) { 42 toolPicker.addObserver(canvasView) 43 toolPicker.setVisible(true, forFirstResponder: canvasView) 44 canvasView.becomeFirstResponder() 45 } 46 }*/ 47 return canvasView 48 } 49 50 func updateUIView(_ uiView: PKCanvasView, context: Context) { 51 } 52 53}

どうすれば、Text()が現在のツールに応じて更新されるでしょうか?
ご教授よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問