8

MKMapView当用户在地图上单击时,我想在我的上面放置一个图钉。我可以使用密码,单击可以使用,但是当我双击缩放时,我会先单击一下。这是我设置识别器的代码:

    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没有得到它们。我尝试在识别器中设置cancelsTouchesInViewNO但这也无济于事。

所以我需要一种方法来防止我的单击识别器获得双击(这似乎不太可能)或将我的双击事件发送到我的 mapView。

4

4 回答 4

4

在 iOS 8 上完美运行,双击操作为空

  - (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双击手势识别器的属性) .

不知道为什么这在 iOS 6 中是不必要的。

于 2012-11-28T13:41:32.057 回答
0

我发现这篇文章对我帮助很大...
基本上,您需要找到 Apple 的手势识别器,并确保您不与它竞争。

乔纳森的解决方案几乎是完美的,除了一件事:
因为在 iOS 7 中,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

iOS 10 上的 Swift 3 版本:

// 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 回答