Ios 在不中断双击缩放的情况下,单次点击MKMapView

Ios 在不中断双击缩放的情况下,单次点击MKMapView,ios,mkmapview,Ios,Mkmapview,当用户点击地图时,我想在我的MKMapView上放置一个pin码。我有pin码工作,我有单点击工作,但当我双击缩放我得到一个单点击第一。以下是我设置识别器的代码: self.doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; self.doubleTap.numberOfTapsRequi

当用户点击地图时,我想在我的
MKMapView
上放置一个pin码。我有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_];
引用苹果的话,这并不奇怪:

注意:在单点击与双点击手势的情况下,如果 单点击手势识别器不需要双点击 如果识别器失败,您应该期望收到您的单个点击 双击操作之前的操作,即使在双击的情况下也是如此 水龙头这是预期的和可取的行为,因为最好的用户 经验通常涉及可堆叠的动作

因此,我在我的单点识别器中添加了
requiregestrerecognizer-tofail

[单点击要求检测识别邮件:双点击]

这确保了我的单点识别器不会出现双点

但是

现在,我的双击识别器得到了双击,而
MKMapView
没有得到它们。我已尝试在识别器中将
cancelsTouchesInView
设置为
NO
,但也没有帮助


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

发布的代码似乎与iOS 6一样工作正常。
地图视图会自动处理双击,而不会干扰单次点击


在iOS 5.x中,要使地图视图在不干扰单次点击的情况下执行其正常的双击处理,请使用GestureRecognitor委托方法实现
应同时识别,并从中返回
YES
(仅需要设置双击手势识别器的
委托
属性)

不知道为什么在iOS 6中不需要这样做。

我发现这对我帮助很大…
基本上,你需要找到苹果的手势识别器,并确保你不会与之竞争

乔纳森的解决方案几乎是完美的,除了一件事:
因为在iOS 7中,MKView的所有手势都在子视图中。如果你想区分哪些是你的(直接添加到MKMap中)哪些是苹果的,这有点方便,但它可能会在将来的某个地方被打破

我最后做的是浏览地图的所有子视图,希望它足够灵活,能够承受未来的一些变化

看起来像这样:

- (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];
                    }
                }
            }
        }
    }
}

在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 ...
     }

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)

你能展示一下你用来添加手势识别器的代码吗?您正在使用哪个iOS版本进行测试?您是否尝试过使用GestureRecognitizer委托方法从ShouldRecognitizesSimultaneousyWithGestureRecognitizer返回YES?问题经过编辑以获得更多代码。我正在用iOS5.1进行测试。还没有尝试过ShouldRecognizeSimultaneousyWithGestureRecognizer代理,我现在就这么做。ShouldRecognizeSimultaneousyWithGestureRecognizer=是的,完成了这个技巧,回答这个问题,我会将其标记为正确答案。谢谢