自定义MKMapView标注不响应触摸事件

时间:2011-12-23 12:12:22

标签: objective-c ios uiview mapkit

我有一个自定义UIView,当用户点击MKMapView上的自定义注释时,我会将其显示为标注。

为实现这一目标,我已将[{1}}子类化,并按照this answer中的建议重载了MKAnnotationView方法。基本上,我将自定义视图添加为-setSelected:selected animated:子类的子视图。

问题是我无法与包含按钮和可滚动webview的标注进行交互。更重要的是,如果标注隐藏了注释并且我在该隐藏注释的大致位置按了标注,则标注将被解除,并且将显示新标注。

MKAnnotationView

以下代码会创建// TPMapAnnotationView.m @implementation TPMapAnnotationView - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; if(selected) { TPMapAnnotation* anno = ((TPMapAnnotation*)self.annotation); QuickInfoView* qi = [[QuickTabView alloc] initWithFrame:CGRectMake(0, 0, 440, 300)]; [qi displayDataForAnnotation:anno]; [self addSubview:qi]; // some animiation code that doesn't change things either way } else { [[self.subviews objectAtIndex:0] removeFromSuperview]; } }

TPMapAnnotationView

2 个答案:

答案 0 :(得分:6)

这是一个众所周知的问题。您在AnnotationView上添加的任何内容都不会检测到触摸。这个问题有很好的开源项目。 http://dev.tuyennguyen.ca/wp-content/uploads/2011/03/CustomMapAnnotationBlogPart1.ziphttp://dev.tuyennguyen.ca/wp-content/uploads/2011/03/CustomMapAnnotationBlogPart21.zip

EDIT:

是。我也努力将uibuttons添加到我自己的自定义annotationView中,但后来我偶然发现了这个项目并发现他的自定义annotationView实际上是一个注释。

无论如何,如果你想改变annotatioView的高度,你可以设置

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{

 calloutMapAnnotationView.contentHeight = height;
 calloutMapAnnotationView.titleHeight = 25;
}

这里,titleHeight是添加到CalloutMapAnnotationView的属性,它决定了&#34; gloss&#34;的高度。在drawRectMethod

- (void)drawRect:(CGRect)rect {
glossRect.size.height = self.titleHeight;
}

如果您遇到任何困难,请告诉我。

还有原始博客的链接: http://dev.tuyennguyen.ca/?p=298

答案 1 :(得分:5)

我解决了这个问题。点击CalloutView中的任何内容,地图都不会触摸。我的calloutview是自定义的tabbleview

1 - 在文件MapviewController.h中,您将添加委托:UIGestureRecognizerDelegate

2 - 并在文件中MapViewController.m实现方法 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

- 在我的mapView中,当你在地图上点击一次时,它会在这个方法中进行3次。所以我限制触摸将动作。第一次触摸将动作。 - 在myCalloutView中有tabbleView,如果tabbleView接收触摸它将返回Map的虚假触摸,它会使你的tabbleview可以触摸。它对你的按钮也一样。

注意:在NSlog命中测试视图:将具有您想要触摸的视图项的名称。 示例我的视图:isEqualToString:@“UITableViewCellContentView”]

static int count=0;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    NSLog(@"hit test view %@",[touch view]);    
    if(count >0 && count<=2)
    {
        count++;
        count=count%2;
        return FALSE;
    }
    count++;      
    if ([[[[touch view] class] description] isEqualToString:@"UITableViewCellContentView"]) {
        return FALSE;
    }
    return TRUE;
}