10

UIViewController の touchesBegan/Moved/Ended メソッドを使用して複数のタッチを処理する際に問題が発生しています。cocos2d アプリ (ccTouchesBegan/Moved/Ended を使用) でも同じ動作が見られるので、この質問は iOS でのすべてのタッチ処理に適用できると思います。私が使用しているコードを以下に示し、その後に表示されている結果を示します。

すべてのメソッドは UIViewController サブクラスに実装されています。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Began");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Moved");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Ended");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

-(void)logTouchesFor:(UIEvent *)event
{
    int count = 1;

    for (UITouch *touch in event.allTouches)
    {
        CGPoint location = [touch locationInView: self.view];

        NSLog(@"%d: (%.0f, %.0f)", count, location.x, location.y);
        count++;
    }
}

さて、興味深い結果は…

シングルタッチは期待どおりに機能します

親指で画面に触れたとしましょう。touchesBegan が期待どおりに呼び出されたことが出力ウィンドウに表示されます。親指を動かすと touchesMoved が呼び出されます。次に、親指を画面から離すと、touchesEnded が呼び出されます。これはすべて予想どおりです。コントロールケースとして質問に含めています。ビューコントローラーがタッチイベントを受信して​​おり、vc.view.userInteractionEnabled = YESどこにも見逃していないことを明確にするためです。

2 回目のタッチでは touchesBegan、touchesMoved、または touchesEnded が呼び出されない

これは最も興味深いものです。親指で画面に触れ (touchesBegan が呼び出されます)、画面上で静止しているとします。次に、親指を同じ場所に置いたまま、人差し指で画面の別の場所に触れます。TouchesBegan は呼び出されません。次に、親指を完全に動かさずに人差し指を動かしたとします (これは難しいかもしれませんが、可能です)。TouchesMoved は呼び出されません。そして、画面から人差し指を離します。TouchesEnded は呼び出されません。最後に、親指を動かして touchesMoved を呼び出します。次に、画面から親指を離すと、touchesEnded が呼び出されます。

明確にするためself.view.multipleTouchEnabled = YESに、私は自分のviewDidLoad方法で設定しました。

ファーストタッチの動きを提供する、セカンドタッチに関する情報が利用可能です

今回は、すぐ上の例と非常によく似た処理を行います。画面を親指でタッチし、親指を動かさずに人差し指でタッチします。TouchesBegan は、親指が画面に当たったときに呼び出されますが、人差し指では呼び出されません。親指を動かすと、touchesMoved が呼び出されます。それだけでなく、event.allTouches 配列には 2 つのタッチがあります (はい、2 番目のタッチは私が期待する場所です)。これは、私が画面に 2 回タッチしたことをシステムが認識していることを意味しますが、View Controller のタッチ処理メソッドを通じて通知されていません。

Second Touch の変更について通知を受けるにはどうすればよいですか?

ファーストタッチが変わった時よりも、セカンドタッチの位置や状態の変化に即応できるようにしたいです。あるタッチを他のタッチに影響を与えずに変更することは非常に難しいため、多くの場合、これは問題になりませんが、問題になる可能性がある状況が少なくとも 1 つあります。明らかな何かが欠けていますか?他の誰かがこの動作に気付いた、または問題を抱えていませんか?

参考までに、私は iOS 5.1 を実行する iPhone 3GS を使用しています。

4

1 に答える 1