4

この問題はそれ自身の質問に値すると思います。別の問題の解決策に添付されているコードを使用して、ここで説明する問題を発見しました。

メインビューコントローラーをUIGestureRecognizerDelegateとして設定し、、、、を実装しtouchesBegan、イベントを含むすべてのタッチオブジェクトに対して、同じオブジェクトのまたはイベントが存在することを前提として、ソリューションをプログラミングしtouchesMovedますtouchesEnded。しかし、そうではないことがわかりました。touchesCancelledtouchesBegantouchesEndedtouchesCancelled

シナリオ:次のイベントがこの順序で発生します。

  • ユーザーはジェスチャー1を開始し、画面に触れて指をスライドさせます。

  • ユーザーがジェスチャー2を開始し、画面の別の場所に触れます。

  • ユーザーは、画面のそれぞれの部分で両方の指をスライドさせ続けます。

  • ユーザーはジェスチャー2のために画面から指を離します。

  • ユーザーはジェスチャー1を続行します。

  • ユーザーはジェスチャー1のために画面から指を離します。

タッチイベントの詳細をキャプチャするために使用NSLogすると、ジェスチャ1とジェスチャ2に別々のタッチオブジェクトが使用されていることがわかります。ただし、、、touchesBeganおよびtouchesMovedtouchesEndedすべてジェスチャ1に対してのみ呼び出さtouchesBegantouchesMoved、ジェスチャ2に対してのみ呼び出されます。イベントtouchesCancelledはどちらかを求めた。

では、ジェスチャ2が呼び出された場合touchesEndedtouchesCancelled呼び出されなかった場合に、どのように判断できますか?

編集:私は同様の症状を持つ別の投稿を見つけました。ただし、私のサブビューのほとんどはプログラムで作成されています。他の人のためにそこで提案されたことを試してみます。私はそれが同じ問題であることに懐疑的ですが、私のテストでは、タッチの場所が他のビューの近くにないためです。

別の編集:以前の編集で投稿されたリンクの推奨事項に従って、サブビューを確認し、ユーザーの操作を確認しました。チェックを外すと、動作が少し異なります。これで、どのタッチイベントでも、2番目のタッチはまったく記録されません。基本的なものが欠けているに違いありません。ちなみに、メインビューと、ユーザーインタラクションがチェックされたビューは、どちらも同じスペースを占めています(一方が他方をカプセル化しています)。

4

2 に答える 2

0

touchesMovedメソッドにこのようなものを入れてみませんか

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSArray* touchData = @[touches,event];
    [self.timer invalidate];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self
                  selector:@selector(touchesFinishedWithoutCallback:) userInfo:touchData
                  repeats:NO];
    [self.timer fire];
}

touchesFinishedWithoutCallback:メソッドは、touchesMovedが呼び出されなくなったときにのみ呼び出されます。

マルチタッチについて詳しく説明する必要がありますが、解決策になる可能性がありますか?

于 2012-12-18T21:00:15.090 に答える
0

それぞれのタッチには、どちらかで始まり、どちらかtouchesBeganで終わる独自のオブジェクトがあるという私の当初の仮定は正しいと思います。とにかく、それは私の現在の実装です。作業中のビューでマルチタッチが有効になっていないため、元々2番目のタッチが表示されていませんでした。コメントの提案に従って、それを有効にしました。その後、セカンドタッチのタッチイベントの一部を見ることができましたが、すべてではありませんでした。セカンドタッチが表示されないことがあるのは、ユーザーインタラクションが有効になっているサブビューがあったためです。どうやら、それはタッチを指揮していた。チェックを外すと、タッチオブジェクトが表示されました。touchesEndedtouchesCancelled

次に、座標によるタッチの追跡をタッチIDに切り替え、すべてのタッチの完全な寿命を追跡することができました。座標による追跡は機能しませんでした。これは、2回目のタッチでは、最初のタッチと同様にtouchLocationを一致させる際に、座標が前の位置ではなくtouchesEnded最後の位置と同じであることがわかったためです。これが紛らわしいように聞こえる場合は、座標ではなくタッチIDでタッチを追跡してください。touchesMovedtouchesEndedtouchesMoved

于 2012-12-22T04:06:30.970 に答える