iPhone SDK開発のネタ帳 マルチタッチ対応

公開日: : 最終更新日:2010/04/20 iPad, iPhone ,

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アプリ開発の極意
iPhone SDK開発のレシピ―113個のレシピで学ぶiPhoneアプリ開発の極意
秀和システム 2010-03
売り上げランキング : 3758

Amazonで詳しく見る by G-Tools

関連記事

no image

iPhone開発本 iPhone Cool Projects

iPhone Games Projectsに続いて、iPhone Cool Projects も買っ

記事を読む

no image

Corona SDK 調査5日目

スクリプト言語による効率的ゲーム開発を読み進めている。 そろそろソースコードを読んでみようと思って本

記事を読む

Photoshop のバッチ処理でiOSアプリアイコンを一括作成する

毎回苦労しているiOSのアプリアイコン作成。今回はPhotoshopのバッチで作成してみる。前回は 

記事を読む

KORG LP-380 で QUICCO SOUND mi.1 を使ってみた

電子ピアノ KORG LP-380 を買ったのでこの機会に以前から気になっていた QUICCO SO

記事を読む

no image

iPhone SDK 3.1.2 のお知らせ

Appleより、iPhone SDK 3.1.2 のお知らせが来た。 3.1.2 はバグフィックスリ

記事を読む

WatchKitのAVSpeechSynthesizerで音が鳴らない

自作英単語学習アプリ EverLearn には watchOS用アプリがあり、iOS側でまちがった

記事を読む

no image

最近読んだ本: iOS デバッグ&最適化技法 2011/06/26

発売されたことは知っていたが、とりあえず必要としてなかったのでずっと買わずにいた、iOSデバッグ&最

記事を読む

no image

セブンイレブンでiPhoneから写真プリント

今は事前登録なしにセブンイレブンでiPhoneからプリントが行えるけれども、店の人もわかって

記事を読む

久々に Reject をくらった話

稼働日カウントダウンという昔作ったアプリにAppStoreのレビューのコメントでリクエストがあった。

記事を読む

Guideline 2.5.10 – Performance – Software Requirements で Reject

2019年3月27日以降、iPhone Xs Maxの画面サイズ6.5インチのスクリーンショットが

記事を読む

Comment

  1. amy より:

    はじめまして、amyと申します。

    私は、UIButtonを複数配置したのですが、6つ以上同時押しをすると
    挙動がおかしくなりました(押された状態で止まる)
    ネットで調べていた所、こちらのサイトにたどり着きました。

    hitTest:withEventを使い、UIButtonのインスタンス変数 highlighted を YESに設定し、
    再び6つ以上同時押しをすると、やはり同じエラーが発生しました。

    tokentokenさんは同じようなことはありませんでしたか?

  2. admin より:

    ちょっと調べてみたところ、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. amy より:

    返信ありがとうございます。

    3つまで同時押しをできるようにしたかったのですが、
    このエラーのせいで、困っていおり、質問しました。

    先ほど、私も調べましたが、iPhone が認識するマルチタッチの最大数は5みたいなので、
    エラーは仕様の可能性が大ですね。

    ただ、試しにiPhone版のおんぷちゃんの方(先ほどDLしました^^)で、
    同時押しをしてみましたが、特に問題ないようなので、
    私のプログラムが何か悪いだけのかもしれません^^;

  4. amy より:

    すいません。

    どうやら、6つ目のタッチでエラーが発生した時、
    highlighted を NOにする処理をしていなかったのが原因でした^^;
    highlighted がずっと YES状態になってただけです。

    6つ目がタッチされた時、touchescancelledが呼び出されるので、そこでhighlighted を NOすれば良かっただけです。
    お騒がせしました。

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Break Back 22巻まで読了

テニス漫画と言えば、ベイビーステップスだと思っていたし、全巻持ってい

TORRAS iPhone 16 Pro Max用ケース

自分はiPhoneはケースを付けない派で、iPhone 12

iPhone 16 Pro Max 購入

iPhone 16 Pro Max 256GB 189000

Ember Mug 2のACアダプタをUSB Type-Cに変えてみた

冬になると活躍する Ember Mug 2 の充電器は付属のACアダ

Wi-Fi6Eルータ TP-Link AXE5400購入

Wi-Fi6E を試してみたくなり、TP-Link AXE5

→もっと見る

PAGE TOP ↑