MKAnnotationView和点击检测

Pad*_*215 9 objective-c mkmapview mkannotation mkannotationview ios

我有一个MKMapView.我添加了UITapGestureRecognizer一个单击.

我现在想MKAnnotationView在地图上添加一个.我可以点击注释并mapView:mapView didSelectAnnotationView:view触发(这是我将添加额外逻辑以显示UIView的地方).

问题是,当我点击注释时,MKMapView点击手势也会触发.

我可以设置它,如果我点击注释,它只响应?

Hep*_*Kes 5

可能有更好更清洁的解决方案但是一种方法就是利用 hitTest:withEvent:轻敲手势识别选择器,例如

假设您已经添加了一个轻拍手势识别器 _mapView

- (void)tapped:(UITapGestureRecognizer *)g
{
    CGPoint p = [g locationInView:_mapView];
    UIView *v = [_mapView hitTest:p withEvent:nil];

    if (v ==  subviewOfKindOfClass(_mapView, @"MKAnnotationContainerView"))
        NSLog(@"tap on the map"); //put your action here
}

// depth-first search
UIView *subviewOfKindOfClass(UIView *view, NSString *className)
{
    static UIView *resultView = nil;

    if ([view isKindOfClass:NSClassFromString(className)])
        return view;

    for (UIView *subv in [view subviews]) {
        if ((resultView = subviewOfKindOfClass(subv, className)) break;
    }
    return resultView;
}
Run Code Online (Sandbox Code Playgroud)

它可能并没有覆盖所有的边缘情况,但它似乎对我来说非常好.

更新(iOS> = 6.0)

最后,我找到了另一种解决方案,其缺点是仅对iOS> = 6.0有效:事实上,这个解决方案利用以这种方式-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer添加到UIViews 的新方法

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // overrides the default value (YES) to have gestureRecognizer ignore the view
    return NO; 
}
Run Code Online (Sandbox Code Playgroud)

即,从iOS 6开始,UIView在手势识别器应忽略的每个视图中覆盖该方法就足够了.