この問題はそれ自身の質問に値すると思います。別の問題の解決策に添付されているコードを使用して、ここで説明する問題を発見しました。
メインビューコントローラーをUIGestureRecognizerDelegateとして設定し、、、、を実装しtouchesBegan
、イベントを含むすべてのタッチオブジェクトに対して、同じオブジェクトのまたはイベントが存在することを前提として、ソリューションをプログラミングしtouchesMoved
ますtouchesEnded
。しかし、そうではないことがわかりました。touchesCancelled
touchesBegan
touchesEnded
touchesCancelled
シナリオ:次のイベントがこの順序で発生します。
ユーザーはジェスチャー1を開始し、画面に触れて指をスライドさせます。
ユーザーがジェスチャー2を開始し、画面の別の場所に触れます。
ユーザーは、画面のそれぞれの部分で両方の指をスライドさせ続けます。
ユーザーはジェスチャー2のために画面から指を離します。
ユーザーはジェスチャー1を続行します。
ユーザーはジェスチャー1のために画面から指を離します。
タッチイベントの詳細をキャプチャするために使用NSLog
すると、ジェスチャ1とジェスチャ2に別々のタッチオブジェクトが使用されていることがわかります。ただし、、、touchesBegan
およびtouchesMoved
はtouchesEnded
すべてジェスチャ1に対してのみ呼び出さtouchesBegan
れtouchesMoved
、ジェスチャ2に対してのみ呼び出されます。イベントtouchesCancelled
はどちらかを求めた。
では、ジェスチャ2が呼び出された場合touchesEnded
とtouchesCancelled
呼び出されなかった場合に、どのように判断できますか?
編集:私は同様の症状を持つ別の投稿を見つけました。ただし、私のサブビューのほとんどはプログラムで作成されています。他の人のためにそこで提案されたことを試してみます。私はそれが同じ問題であることに懐疑的ですが、私のテストでは、タッチの場所が他のビューの近くにないためです。
別の編集:以前の編集で投稿されたリンクの推奨事項に従って、サブビューを確認し、ユーザーの操作を確認しました。チェックを外すと、動作が少し異なります。これで、どのタッチイベントでも、2番目のタッチはまったく記録されません。基本的なものが欠けているに違いありません。ちなみに、メインビューと、ユーザーインタラクションがチェックされたビューは、どちらも同じスペースを占めています(一方が他方をカプセル化しています)。