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

iPad mini 用透明ハードケース eggshell for iPad mini

iPad mini 用にハードケースを購入した。 iPad 用ケー

記事を読む

no image

SANWA SUPPLY MR-IPADST1 iPadスタンド

以前から欲しかったのと手頃な値段だったのでAmazonで注文してみた。 人気があるのか、1-3週間待

記事を読む

no image

iPhone開発のネタ帳: コールアウト代用部品を作る

Map Kit を使うと、地図上に吹き出しのようなものを表示できる。この吹き出しのようなものをコ

記事を読む

no image

おんぷちゃん for iPad 1.3.3 Submit

今回は紅白歌合戦を見ながらSubmit。 相変わらずうちの娘が譜読みに苦労していて新しい曲を弾く

記事を読む

[iOS SDK] アプリを起動しない 3D quick action は実現できるか

iPhone 6s / iPhone 6s Plus から 3D Touch 機能が搭載されたが、搭

記事を読む

EverLearn 1.8.1 を公開しました

EverLearn 1.8.1 を本日公開しました (2016/10/27)単語検索ページで単語をハ

記事を読む

no image

[iPhone SDK] iOS 4で導入された Blocks とは

Game Center を試していると、たくさんの^ (Caret というらしい。自分はハットと覚え

記事を読む

Linking 対応デバイス tomoru

この前 Makuake で出資しそこねた Tomoru が Amazon で ¥ 1,069 + ¥

記事を読む

no image

LogLocations iOS7 不具合調査 (startMonitoringSignificantLocationChanges 挙動変更)

LogLocations のユーザの方から、iOS7 になってからLogLocationsでログが保

記事を読む

no image

見たかった映画「ソーシャル・ネットワーク」を見る複数の方法

かなり見たかったけれどもふたごが小さくてとても見に行けなかった映画、「ソーシャル・ネットワーク」がも

記事を読む

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

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

リズムくんがタイ表示に対応しました

長らくお待たせしました。リズム学習アプリ「リズムくん」iPhone版

さくらのVPSにwordpress + gitlabを入れる

さくらのVPSに apache + wordpressをインストール

Apple Watch series 2の電池が1日もたなくなってしまった

一日もたないので、時刻を見ようと思っても見れない。時計としての体をな

iOS 13の新機能をざっくり把握する本 購入

https://twitter.com/shu223/status

ソニーのノイキャンヘッドセットWF-1000XM3購入

ちまたで話題の WF-1000XM3 を購入した。届くのはい

→もっと見る

PAGE TOP ↑