iPhone SDK開発のネタ帳 マルチタッチ対応
iPhone SDK開発のレシピにはいろいろ役に立つ内容があったので、同じようなことをブログに書いてみようの活動。
自作アプリおんぷちゃんでは、UIViewn上にUIButtonを置く形でピアノの鍵盤を実現しているが、今まではマルチタッチに対応していなかったので、和音に対応できていなかった。
今回、iPadアプリを作るにあたって、iPadはでかいので実寸に近い形で鍵盤を置くことができるので、今までのおんぷあてやおとあてだけではなく、普通に演奏できるモードも用意したいと思った。
実際にはiPadのグランドオープニングには全く間に合わなかったが、その後も細々と開発を続けている。
で、困っていたのは UIViewの上に複数のUIButtonを置いて、そのUIButtonを複数同時に押しても、どうやらマルチタッチにならない。UIButtonのtouchesBeganやtouchesMovedに [self.nextResponder touchesBegan:touches withEvent:event] を入れても superview にはマルチタッチとして渡らない。
で、今朝調べていたところようやく原因と思われるものを発見。
Apple のこのページに日本語で詳しく書かれていた。
ページの最後の方に、「ところが、マルチタップやマルチタッチは、それらが最初に発生したサブビューに関連付けられているため、スーパービューではこれらのタッチを受け取ること ができません。すべての種類のタッチを確実に受け取れるようにするには、スーパービューでhitTest:withEvent:を オーバーライドして、サブビューではなく自分自身を返すようにします。」と書かれている。
そこで、下記コードを入れてみたところ UIButton にはタッチ情報が渡らなくなり、UIViewの方でマルチタッチを検知できるようになった。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if(CGRectContainsPoint(self.bounds, point)) { return self; } return nil; }
これにより、UIButtonが反応しなくなるので、CGRectContainsPoint()などを使ってヒットテストを行って、ボタンを手動でハイライト状態にする必要がある(UIButtonのインスタンス変数 highlighted に YES を入れる)。
UIViewのtouchesBegan:やtouchesMoved:にはUITouchがセットとして複数来るようになるので、ループを回して適切にハンドルする必要がある。
無為空間さんのページも参考にさせてもらいました。
追伸
hitTest:withEvent を使うようになってから、どうもアプリの挙動がおかしいと思っていたら、hidden プロパティを YES にした UIView のhitTest:withEvent が呼ばれていた。これはバグではないのか?これを避けるために、hitTest:withEventの中で、hidden プロパティの値をチェックして、hiddenがYESであればnilを返すようにして回避した。
iPhone SDK開発のレシピ―113個のレシピで学ぶiPhoneアプリ開発の極意 | |
![]() |
秀和システム 2010-03 売り上げランキング : 3758 by G-Tools |
関連記事
-
-
おんぷちゃん for iPad 1.9.0が異常終了する
ユーザの方から下記の連絡がありました。 おんぷちゃんfor iPadを使用させて頂いておりま
-
-
[iPhone 開発本] iPhone Advanced Projects がおもしろい
Apressのページはこちら。公開されているサンプルコードは43MBもある。
-
-
GTD用にOmniFocusを購入
半年くらいMacBookとiPhoneでOmniFocusを使っている。 なかなか良いので、紹介して
-
-
[iOS SDK] Game Center の Leaderboard 機能を利用してみた
自分で作っている英単語学習アプリを自分でひたすらテストをしているのだけれども、実際やってみるとなかな
-
-
AWS IoTを利用してクラウド連携機能を追加してみた
GWに自宅待機でまとまった時間が確保できたので、AWS IoT を利用してMQTTを使った
-
-
[iPhone SDK] sqlite 学習中。FMDB を知る。
SQLite入門 第2版西沢 直木 翔泳社 2009-05-19売り上げランキング : 17582
-
-
[iPhone SDK] 自作iPhone アプリのアイコンをつや消しにする
iPhone のホーム画面に表示されるアプリアイコンは自動的に てかてか つやつや 効果を付与されて
-
-
自作アプリ おんぷちゃん にランキングモードを追加
かなり前からほそぼそと準備を続けていた、五線譜学習アプリ おんぷちゃんへのランキング挑戦モード追加
-
-
おんぷちゃん for iPad 2.0.0リリース
あけましておめでとうございます。今年もよろしくお願いします。 2022年8月にはだいたい完成
-
-
[iOS SDK] Studyplus の API を利用してみる
学習管理プラットフォーム「Studyplus」がAPIを公開——外部教材アプリとの連携を強化 | T
Comment
はじめまして、amyと申します。
私は、UIButtonを複数配置したのですが、6つ以上同時押しをすると
挙動がおかしくなりました(押された状態で止まる)
ネットで調べていた所、こちらのサイトにたどり着きました。
hitTest:withEventを使い、UIButtonのインスタンス変数 highlighted を YESに設定し、
再び6つ以上同時押しをすると、やはり同じエラーが発生しました。
tokentokenさんは同じようなことはありませんでしたか?
ちょっと調べてみたところ、iPhone が認識するマルチタッチの最大数は5であるようです。
http://stackoverflow.com/questions/1202484/how-to-force-iphone-ipod-touch-to-handle-more-than-5-touches-at-the-same-time
なので、6つ目でエラーが発生するのは仕様なのかも知れません。
私はiPadで上記を実装していますが、iPadは11点まで認識できるという記事があったので、この制限にはひっからなかったようです。
(全部の指を使ってひいても10点なので遭遇しなかった)
返信ありがとうございます。
3つまで同時押しをできるようにしたかったのですが、
このエラーのせいで、困っていおり、質問しました。
先ほど、私も調べましたが、iPhone が認識するマルチタッチの最大数は5みたいなので、
エラーは仕様の可能性が大ですね。
ただ、試しにiPhone版のおんぷちゃんの方(先ほどDLしました^^)で、
同時押しをしてみましたが、特に問題ないようなので、
私のプログラムが何か悪いだけのかもしれません^^;
すいません。
どうやら、6つ目のタッチでエラーが発生した時、
highlighted を NOにする処理をしていなかったのが原因でした^^;
highlighted がずっと YES状態になってただけです。
6つ目がタッチされた時、touchescancelledが呼び出されるので、そこでhighlighted を NOすれば良かっただけです。
お騒がせしました。