スマートフォンの「スマート」は、さまざまなセンサやハードウェアを使うところにある。本連載で、さまざまなセンサやハードウェアを使うiOS(iPhone、iPad、iPod touch)のスマートなアプリを作ってみよう
簡単そうで難しいマルチタッチのイベント処理
- - PR -
iOSに限らず、スマートフォン向けアプリを開発するうえで避けては通れないマルチタッチイベント。前回の「iPhoneアプリでBluetooth通信を使うための基礎知識」までの記事と比較すると、とても簡単に思われますが、実は意外と落とし穴があります。今回は、そんなマルチタッチイベントを使用したiOSアプリの開発方法を紹介します。
なお、今回作成するサンプルアプリは、エミュレータでの動作確認ができないため、実機で試すには「iOS Developer Program」への登録(有料)が必要です。また、今回のサンプルアプリを作成するに当たって、開発環境はXcode 4.3.3とiOS SDK 5.1(ARC、StoryBoardを使用)を、検証用のデバイスはiPhone 4を使用しています。
知ってましたか? タッチパネルと、その方式
スマホユーザーからすればタッチパネルを用いたインターフェイスは、もはや当たり前です。さらに、「初めてスマホを手にしたユーザーは操作できるの??……」なんて言うのも時代錯誤もいいところで、スマホでなくてもタッチパネルを用いたインターフェイスは私たちの身の周りにたくさんあります。
まずパッと思いつくのは銀行ATMです。タッチパネルを採用していない銀行ATMを探す方が難しいでしょう。電車の切符の券売機も、ほぼすべてタッチパネルです。ほかにもカーナビ、携帯ゲーム機など、スマホに限らずタッチパネルは幅広く利用されているわけです。
そんなタッチパネルですが、タッチパネルとひと言で言っても動作原理はさまざまで、抵抗膜方式、静電容量方式、電磁誘導方式、赤外線方式などがあります。その中でも、iPhoneはマルチタッチを検出できる投影型の静電容量方式を採用しています。この辺の詳しい説明は以下の記事に任せて、本題に入りたいと思います。
iPhoneでマルチタッチができるのはなぜ? デジタル技術の仕組みと傾向(2) 現在主流となっている「抵抗膜方式」とiPhoneに採用されている「静電容量方式」を基に、タッチパネルの仕組みを解説します |
iOSアプリ開発におけるマルチタッチイベント
■ そもそもどうやってタッチイベントを取得するの?
結論から言うと、UIResponderクラスのメソッドをオーバーライドしてタッチイベントを取得・処理します。UIResponderオブジェクトとは、タッチイベントやシェイクなどのイベントを管理するクラスで、UIView、UIViewController、UIApplicationのスーパークラスでもあります。
また、UIButtonやUITextFieldなどの部品はUIControlを継承しており、UIControlはUIViewのサブクラスです。
このように、iOSのインターフェイス構築に欠かせないUI○○クラスは直接的、または間接的にUIResponderクラスを継承しており、これらのクラスのオブジェクトを「レスポンダオブジェクト」、または単に「レスポンダ」と呼んだりします。
しかし、iOS開発では画面を作成する際に、たくさんの部品、すなわちレスポンダオブジェクトが配置されるわけですが、いったいどうやってタッチイベントを振り分けているのでしょうか。
■ レスポンダチェーンResponder Chain
その問題を解決するために、iOSでは「レスポンダチェーン(Responder Chain)」と呼ばれる仕組みが用意されています。レスポンダチェーンとは、一連のレスポンダオブジェクトの連なり(チェーン)のことで、イベントを処理できるオブジェクトを決定するために使用されます。
レスポンダオブジェクトは基本的にビュー階層の下位に位置するオブジェクトから順に評価されます。特に、最初に評価される(イベントを受け取る)レスポンダオブジェクトを「ファーストレスポンダ(First Responder)」と呼びます。
図1 イベント処理が行われなければ、次のレスポンダオブジェクトへイベントを伝搬する |
上の図をご覧ください。イベントが発生すると、まずビューの最下層に位置するUIButtonクラスがFirstResponderとなり、イベントを受け取ります。通常ならUIButtonがイベントを処理して終了なのですが、もしここでイベントの処理が行われない場合、上の階層に位置するUIView、つまり次のレスポンダオブジェクトにイベントが送られます。
どのレスポンダオブジェクトもイベントの処理を行わない場合、最終的にUIApplicationに到達し、そこでも処理が行われなければ、このイベントは無視されてしまいます。
それでは、具体的にイベントの処理をどのように実装すれば良いのでしょうか。それが最初にお話ししたUIResponderクラスのメソッドというわけです。
iOSでマルチタッチイベントを処理するメソッド
さて、前置きが長くなってしまいましたが、ようやく実装の話に入りたいと思います。UIResponderクラスではマルチタッチイベントを処理するために、以下の4つのメソッドが定義されており、これらのメソッドをサブクラスでオーバーライドしてタッチイベントの処理を実装します。
■ - touchesBegan:withEvent:
画面に指を1本以上タッチしたときに実行されるメソッドです。
■ - touchesMoved:withEvent:
画面に触れている指が一本以上移動したときに実行されるメソッドです。
■ - touchesEnded:withEvent:
指を1本以上画面から離したときに実行されるメソッドです。
■ - touchesCancelled:withEvent:
システムイベント(低メモリ警告や電話着信など)がタッチイベントをキャンセルしたときに実行されるメソッドです。
また、上記4つのメソッドでは、共通して以下の引数を取り扱います。
■ (NSSet *)touches
イベント発生に関連するタッチイベントUITouchオブジェクトを保持するセット(重複を許さないコレクション)です。
■ (UIEvent *)event
UIEventオブジェクトはiOSのイベントを表すオブジェクトです。イベントタイプは主にタッチイベント、モーションイベント、リモートコントロールイベントの3つがあります。
特に、今回使用するタッチイベントタイプのUIEventオブジェクトはマルチタッチ、つまり複数の指でタッチしている間存続します。
次ページでは、実際に簡単なソースコードで上記のメソッドの動きを確認してみましょう。
1-2 |
INDEX | ||
iPhone/iPadスマートアプリ開発レシピ(5) iOSでマルチタッチができるアプリを作るための初歩 |
||
Page1 簡単そうで難しいマルチタッチのイベント処理 知ってましたか? タッチパネルと、その方式 iOSアプリ開発におけるマルチタッチイベント iOSでマルチタッチイベントを処理するメソッド |
||
Page2 「UIResponder」のメソッドを実際に使ってみよう 反射神経測定iPhoneアプリを作ろう マルチタッチイベントを制する者はiOSアプリ開発を制す |
Smart&Social フォーラム トップページへ |
- 夏休みの自由研究にマイコンボードで「電子サイコロ」を作ったり、音楽プログラミングをしたりしてみよう (2017/7/24)
子ども向け電子工作&プログラミング用マイコンボード「chibi:bit」の基本的な使い方を紹介する企画。夏休みの自由研究に「電子サイコロ」を作ったり、音楽プログラミングをしたりしてみよう - 子ども向け電子工作&プログラミング用マイコンボード「chibi:bit」の基本的な使い方 (2017/7/20)
子ども向け電子工作&プログラミング用マイコンボード「chibi:bit」の基本的な使い方を紹介する。夏休みの子どもの自由研究などに役立てつつ、プログラミングを始めるきっかけにしてみてはいかがだろうか - 3DゲームのAIをiOSのSceneKitとGameplayKitで作る基本 (2017/7/10)
3Dゲーム用のフレームワークSceneKitを使った簡単なアプリ制作を通して、3Dゲーム用の人工知能(AI)について学ぶ - UnityアプリをWebGL、UWP、Android、iOS用としてビルドしてみた (2017/6/27)
アプリをWebで実行できるように書き出す方法やWindows上でUWP、Android、iOS用などにビルドする方法について解説する【Windows 10、Unity 5.6に対応】
|
|