8

MKMapViewユーザーが地図をシングルタップしたときにピンをドロップしたい。PINコードが機能していて、シングルタップが機能していますが、ダブルタップしてズームすると、最初にシングルタップが表示されます。レコグナイザーをセットアップするための私のコードは次のとおりです。

    self.doubleTap = [[UITapGestureRecognizer alloc]
                      initWithTarget:self action:@selector(handleDoubleTap:)];
    self.doubleTap.numberOfTapsRequired = 2;
    self.doubleTap.numberOfTouchesRequired = 1;
    [mapView_ addGestureRecognizer:doubleTap_];

    self.singleTap = [[UITapGestureRecognizer alloc]
                      initWithTarget:self action:@selector(handleGesture:)];
    self.singleTap.numberOfTapsRequired = 1;
    self.singleTap.numberOfTouchesRequired = 1;
    [self.singleTap requireGestureRecognizerToFail: doubleTap_];
    [mapView_ addGestureRecognizer:singleTap_];

さて、これは驚くべきことではありません、Appleを引用すると:

注:シングルタップジェスチャとダブルタップジェスチャの場合、シングルタップジェスチャレコグナイザでダブルタップレコグナイザが失敗する必要がない場合は、ダブルタップの前にシングルタップアクションを受け取ることを期待する必要があります。ダブルタップの場合でも、アクション。最高のユーザーエクスペリエンスには一般にスタック可能なアクションが含まれるため、これは予想される望ましい動作です。

requireGestureRecognizerToFailそこで、シングルタップレコグナイザーに追加しました。

[singleTap requireGestureRecognizerToFail:doubleTap];

これにより、シングルタップレコグナイザーがダブルタップされないようになります。

だが...

今、私のダブルタップレコグナイザーはダブルタップをMKMapView取得しますが、取得しません。レコグナイザーでに設定cancelsTouchesInViewしてみましNOたが、それも役に立ちませんでした。

そのため、シングルタップレコグナイザーがダブルタップを取得しないようにする方法(これはありそうもないようです)、またはダブルタップイベントをmapViewに取得する方法が必要です。

4

4 に答える 4

4

iOS 8で完全に機能し、ダブルタップアクションはnullです

  - (void)viewDidLoad 
    {
        [super viewDidLoad];

        UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:nil];
        doubleTap.numberOfTapsRequired = 2;
        doubleTap.numberOfTouchesRequired = 1;
        [self.mapView addGestureRecognizer:doubleTap];

        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
        singleTap.numberOfTapsRequired = 1;
        singleTap.numberOfTouchesRequired = 1;
        [singleTap requireGestureRecognizerToFail: doubleTap];
        [self.mapView addGestureRecognizer:singleTap];
     }

   - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
     {
            if (gestureRecognizer.state != UIGestureRecognizerStateEnded)
                return;
            //Do your work ...
     }
于 2015-04-03T10:44:03.987 に答える
2

投稿されたコードは、iOS 6ではそのままで正常に機能しているようです。
ダブルタップは、シングルタップに干渉することなく、マップビューによって自動的に処理されます。

iOS 5.xでは、シングルタップに干渉することなくマップビューで通常のダブルタップ処理を実行するには、shouldRecognizeSimultaneouslyWithGestureRecognizerデリゲートメソッドを実装してそこから戻ります(ダブルタップジェスチャレコグナイザーYESのプロパティのみを設定する必要があります) delegate

iOS6でこれが必要ない理由がわかりません。

于 2012-11-28T13:41:32.057 に答える
0

この投稿は私を大いに助けてくれました...
基本的に、あなたはAppleのジェスチャーレコグナイザーを見つけて、それと競合しないようにする必要があります。

Jonathanのソリューションは、1つのことを除いて、ほぼ完璧
でした。iOS7では、MKViewはすべてのジェスチャをサブビューに持っているためです。(MKMapに直接追加された)ものとAppleのものを区別したい場合は便利ですが、将来どこかで壊れてしまう可能性があります。

私がやったことは、少なくともいくつかの将来の変更に耐えるのに十分な柔軟性があることを期待して、マップのすべてのサブビューを調べることでした...

次のようになります。

- (void) hackInTheGestureRecognizer {

    for (UIView *aSubview in [[self theMap] subviews]) {

        if ([aSubview isMemberOfClass:[UIView class]]) {

            for (UIGestureRecognizer *aRecognizer in [aSubview gestureRecognizers]) {

                if ([aRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {

                    if ([(UITapGestureRecognizer *) aRecognizer numberOfTapsRequired] == 2) {

                        [[self singleTapRecognizer] requireGestureRecognizerToFail:aRecognizer];
                    }
                }
            }
        }
    }
}
于 2014-04-02T21:54:23.373 に答える
0

iOS10のSwift3バージョン:

// Gesture recognizer set up in Interface Builder
@IBOutlet weak var singleTapRecognizer: UITapGestureRecognizer!

override func viewDidLoad() {
    // double tap recognizer has no action
    let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: nil)
    doubleTapRecognizer.numberOfTapsRequired = 2
    doubleTapRecognizer.numberOfTouchesRequired = 1
    mapView.addGestureRecognizer(doubleTapRecognizer)

    singleTapRecognizer.require(toFail: doubleTapRecognizer)
}

シングルタップはIBで作成されることに注意してください。次のようなコードで簡単に作成できます。

    let singleTapRecognizer = UITapGestureRecognizer(target: self, action: Selector("someAction"))
    singleTapRecognizer.numberOfTapsRequired = 1
    singleTapRecognizer.numberOfTouchesRequired = 1
    mapView.addGestureRecognizer(singleTapRecognizer)
于 2017-05-30T19:09:59.680 に答える