我有一个自定义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
答案 0 :(得分:6)
这是一个众所周知的问题。您在AnnotationView上添加的任何内容都不会检测到触摸。这个问题有很好的开源项目。 http://dev.tuyennguyen.ca/wp-content/uploads/2011/03/CustomMapAnnotationBlogPart1.zip,http://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;
}