单击MKMapView而不会破坏双击缩放

时间:2012-11-26 19:20:17

标签: ios mkmapview

当用户单击地图时,我想在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 个答案:

答案 0 :(得分: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 ...
     }

答案 1 :(得分:2)

发布的代码似乎在iOS 6中正常工作。
双击由地图视图自动处理,不会干扰单击。

在iOS 5.x中,要使地图视图执行其正常的双击处理而不干扰您的单击,请实施shouldRecognizeSimultaneouslyWithGestureRecognizer委托方法并从中返回YES(需要仅设置双击手势识别器的delegate属性。

不确定为什么在iOS 6中没有必要这样做。

答案 2 :(得分:0)

我发现this post给了我很多帮助...... 基本上,您需要找到Apple的手势识别器,并确保您不会与之竞争。

Jonathan的解决方案几乎是完美的,除了一件事:
因为在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];
                    }
                }
            }
        }
    }
}

答案 3 :(得分:0)

iOS 10上的Swift 3版本:

let filter_string = '';
input.on('keyDown', e => filter_string = e.target.value)

<Items filter={filter_string} />

请注意,在IB中创建单击。它可以很容易地在代码中创建:

// 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)
}