1

ユーザーがビューでタッチダウンおよびタッチアップしたときを検出しようとしています。ビューには、いくつかのボタンとその他のUIKitコントロールが含まれています。これらのタッチイベントを検出したいのですが、消費しません。

私は2つのアプローチを試しましたが、どちらも十分ではありませんでした。

最初に、-touchesBegan:withEvent:と-touchesEnded:withEvent:をオーバーライドする透明なオーバーレイを追加し、次のレスポンダーにイベントを転送します。

[self.nextResponder touchesBegan:touches withEvent:event]

ただし、UIKitオブジェクトは転送されたすべてのイベントを無視しているようです。

次に、-pointInside:withEvent:と-hitTest:withEvent:をオーバーライドしてみました。これはタッチダウンイベントを検出するのに最適ですが、pointInside::とhitTest::はタッチアップ時に呼び出されません(つまり、[[[event allTouches] anyObject]phase]がUITouchPhaseEndedと等しくなることはありません)。

基盤となるUIControlとの相互作用を妨げることなく、タッチダウンイベントとタッチアップイベントの両方を検出するための最良の方法は何ですか?

4

1 に答える 1

-1

iOSのイベント処理ガイドによると、次の 3つのオプションがあります。

1)sendEventをオーバーライドするためのUIWindowのサブクラス化:

2)オーバーレイビューを使用する

3)それをする必要がないように設計する...本当に2つのオプションのようです。

これは、UIWindowサブクラスを使用したapplesの例の簡略化です。

1)NIBのウィンドウのクラスをUIWindowのサブクラスに変更します。2)このメソッドを.mファイルに入れます。

- (void)sendEvent:(UIEvent *)event
{
    NSSet * allTouches = [event allTouches];

    NSMutableSet *began = nil;
    NSMutableSet *moved = nil;
    NSMutableSet *ended = nil;
    NSMutableSet *cancelled = nil;

    // sort the touches by phase so we can handle them similarly to normal event dispatch
    for(UITouch *touch in allTouches) {
        switch ([touch phase]) {
            case UITouchPhaseBegan:
                if (!began) began = [NSMutableSet set];
                [began addObject:touch];
                break;
            case UITouchPhaseMoved:
                if (!moved) moved = [NSMutableSet set];
                [moved addObject:touch];
                break;
            case UITouchPhaseEnded:
                if (!ended) ended = [NSMutableSet set];
                [ended addObject:touch];
                break;
            case UITouchPhaseCancelled:
                if (!cancelled) cancelled = [NSMutableSet set];
                [cancelled addObject:touch];
                break;
            default:
                break;
        }

        // call our methods to handle the touches
        if (began)
        {
            NSLog(@"the following touches began: %@", began);
        };
        if (moved)
        {
            NSLog(@"the following touches were moved: %@", moved);
        };
        if (ended)
        {
             NSLog(@"the following touches were ended: %@", ended);
        };
        if (cancelled) 
        {
             NSLog(@"the following touches were cancelled: %@", cancelled);
        };
    }
    [super sendEvent:event];
}

出力が多すぎますが、アイデアが浮かびます...そしてロジックを希望の場所に適合させることができます。

于 2011-06-17T23:20:16.167 に答える