今回も「Shapes」テンプレートを選んで作成したプレイグラウンドを使って進めます。今回のメインのトピックは「イベント処理」です。単に「イベント」と言えば、普通はなんらかの「催し物」を想像するでしょう。しかしイベント処理のイベントはちょっと違います。どちらかというと、いつ起こるかわからない「出来事」に近い意味です。つまりイベント処理とは、何か事が起こったときに、それに対処するということです。
スマホ用をはじめとして現在のアプリは、基本的にユーザーが何か操作をすると、それに応答するかたちで動作します。この場合、ユーザーの操作がイベント、つまり対処すべき出来事ということになります。このようにして動作するプログラムを「イベントドリブン」などと言います。「イベントによって駆動される」という意味です。
イベントがどんなものかはわかったとして、それとグラフィックとどんな関係があるのかと疑問に思われるかもしれません。実はイベントとグラフィックは大いに関係があるどころか、現在のアプリの根幹を成す二重らせん構造のような、切っても切れない関係なのです。今回は、そのあたりを明らかにしていきましょう。
これまでに、縁、直線、長方形といった図形オブジェクトを作成し、その属性によって、それらの図形の大きさ、位置、色などを設定する方法を学んできました。また、属性を連続的に変化させることで、一種のアニメーションの表示が可能であることも試しました。
図形オブジェクトには、イベント処理のためのファンクションを定義する機能があります。そうしたファンクションも、広い意味ではそれぞれの図形オブジェクトが備えている属性の一種と考えられます。
こうしたイベント処理を扱うファンクションは、一般に「コールバック」などと呼ばれています。これは、アプリが自ら呼んで使うためのものではなく、システム側から呼び出してもらうために用意しておくものだからです。ここでのシステムとは、iPadのタッチ画面に対するユーザーの操作を監視しているiOSであり、起動中のアクティブなアプリとしてiOSから操作情報を受け取るSwift Playgroundsのそのものです。プレイグラウンド上で作成したプログラムは、Swift Playgroundsを含むシステム側から見ると、1つのアプリとして動作していることになります。そして、自分が設定したコールバックによって、必要なイベントを受け取ることができるのです。
ユーザーがiPadの画面を操作する場合を考えると、その対象となるのは、ほとんど画面に表示されたなんらかの「図形」です。以前のiOSなら、ボタンやスイッチなど、現実の「物」を模した図形を操作する感覚を演出していました。今では、かなりシンプルになっていますが、リンクのようなテキストでも、やはり一種の図形と考えられます。
Shapes環境で描くことのできる図形オブジェクトには、ユーザーが図形にタッチしたり、さらにそのままドラッグしたりした際に発生するイベントを受け取るファンクションが備わっています。それらの基本形を以下に示します。
onTouchCancelled { code }
onTouchCancelled(handler: () -> Void)
onTouchDown { code }
onTouchDown(handler: () -> Void)
onTouchDrag { code }
onTouchDrag(handler: () -> Void)
onTouchUp { code }
onTouchUp(handler () -> Void)
全部で8個挙げましたが、1種類のイベントについて2パターンずつあるので、イベントの種類は4つです。2つのパターンとは、その場にコードを書くパターンと、イベントに対する処理を記述した別のファンクションを指定するパターンです。機能的にはほとんど同じと考えていいでしょう。前回のアニメーション機能のanimateにも、同じような2パターンがあったことが思い出されます。
4種類のイベントは、「タッチがキャンセルされた」「タッチされた」「ドラッグされた」「指が画面から離された」というものです。このうちタッチのキャンセルは、ユーザーの操作によってはできそうもありません。例えばiPhoneなら、タッチ操作中に電話がかかってきたといった外部要因によって、ユーザーの操作そのものがキャンセルされます。
今回は、Swift Playgroundsではほどんと起こりそうもない「キャンセル」のイベントは無視して、残りの3つのイベントを扱います。
この連載の記事
- 第100回 SceneKitの物理現象シミュレーションとアニメーションをARKitに持ち込む
- 第99回 「物理学体」と「物理学場」を設定して物理現象をシミュレーション
- 第98回 SceneKitのノードに動きを加えるプログラム
- 第97回 いろいろな形のノードをシーンの中に配置する
- 第96回 SceneKitの基礎シーンビュー、シーン、ノードを理解する
- 第95回 現実世界の床にボールや自動車のモデルを配置する
- 第94回 ARKitを使って非現実世界との融合に備える
- 第93回 ARKitが使えるiPadを識別するプログラム
- 第92回 Swift Playgrounds 2.1での問題点をまとめて解消する
- 第91回 iPadの内蔵カメラで撮影した写真を認識するプログラム
- この連載の一覧へ