iPhone/iPadスマートアプリ開発レシピ
iPhone/iPadスマートアプリ開発レシピ(5)

iOSでマルチタッチができるアプリを作るための初歩


クラスメソッド株式会社
開発部 平井祐樹
2012/8/7
スマートフォンの「スマート」は、さまざまなセンサやハードウェアを使うところにある。本連載で、さまざまなセンサやハードウェアを使うiOSiPhoneiPadiPod touchのスマートなアプリを作ってみよう

簡単そうで難しいマルチタッチのイベント処理

- PR -

 iOSに限らず、スマートフォン向けアプリを開発するうえで避けては通れないマルチタッチイベント。前回の「iPhoneアプリでBluetooth通信を使うための基礎知識」までの記事と比較すると、とても簡単に思われますが、実は意外と落とし穴があります。今回は、そんなマルチタッチイベントを使用したiOSアプリの開発方法を紹介します。

 なお、今回作成するサンプルアプリは、エミュレータでの動作確認ができないため、実機で試すには「iOS Developer Program」への登録(有料)が必要です。また、今回のサンプルアプリを作成するに当たって、開発環境はXcode 4.3.3iOS SDK 5.1(ARC、StoryBoardを使用)を、検証用のデバイスはiPhone 4を使用しています。

知ってましたか? タッチパネルと、その方式

 スマホユーザーからすればタッチパネルを用いたインターフェイスは、もはや当たり前です。さらに、「初めてスマホを手にしたユーザーは操作できるの??……」なんて言うのも時代錯誤もいいところで、スマホでなくてもタッチパネルを用いたインターフェイスは私たちの身の周りにたくさんあります。

 まずパッと思いつくのは銀行ATMです。タッチパネルを採用していない銀行ATMを探す方が難しいでしょう。電車の切符の券売機も、ほぼすべてタッチパネルです。ほかにもカーナビ、携帯ゲーム機など、スマホに限らずタッチパネルは幅広く利用されているわけです。

 そんなタッチパネルですが、タッチパネルとひと言で言っても動作原理はさまざまで、抵抗膜方式静電容量方式電磁誘導方式赤外線方式などがあります。その中でも、iPhoneはマルチタッチを検出できる投影型の静電容量方式を採用しています。この辺の詳しい説明は以下の記事に任せて、本題に入りたいと思います。

iPhoneでマルチタッチができるのはなぜ?
デジタル技術の仕組みと傾向(2)
 現在主流となっている「抵抗膜方式」とiPhoneに採用されている「静電容量方式」を基に、タッチパネルの仕組みを解説します
MONOist > 電子機器 2009/5/13

iOSアプリ開発におけるマルチタッチイベント


そもそもどうやってタッチイベントを取得するの?

 結論から言うと、UIResponderクラスメソッドオーバーライドしてタッチイベントを取得・処理します。UIResponderオブジェクトとは、タッチイベントやシェイクなどのイベントを管理するクラスで、UIViewUIViewControllerUIApplicationスーパークラスでもあります。

 また、UIButtonUITextFieldなどの部品は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 フォーラム トップページへ



Smart & Social フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Smart & Social 記事ランキング

本日 月間