在MapKit中使用字母数字表示的自定义引脚

时间:2013-12-28 16:52:56

标签: ios objective-c mapkit

我现在正在教自己在Objective C中使用MapKit。我已经到了可以自动缩放到包含多个注释的位置的地步。我用内置引脚表示注释。如果你点击图钉我有一个字母数字2字符串代表那个点。

我心想,为了更好的可用性,为什么不用实际数据替换引脚。有点像天气图,它们将温度显示为针。这可行吗?

我研究了这个,我能找到的就是:

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation
{
    static NSString *AnnotationViewID = @"annotationViewID";

    MKAnnotationView *annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];

    if (annotationView == nil) {
        annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID] autorelease];
    }

    annotationView.image = [UIImage imageNamed:@"location.png"];
    annotationView.annotation = annotation;

    return annotationView;
}

问题是我不能也不应该为两个字符的每个组合都有一个自定义图像。有没有办法让我在引脚的位置绘制这些数字。

我找到了这个参考: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/LocationAwarenessPG/AnnotatingMaps/AnnotatingMaps.html

我是在正确的轨道上。是否有一些我可以利用的完整示例来更好地理解流程。

我希望能够选择该自定义引脚,然后显示或显示更多详细信息。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

安娜,谢谢你的链接,我尝试了它并且它有效。我做了一些改进以改善标签的美感,我想我会在此发表我的发现以供参考:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation {     if([注释isKindOfClass:[MKUserLocation class]])         返回零;

static NSString *reuseId = @"MapViewController";
MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
if (av == nil)
{
    av = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId];

    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
    //UILabel *lbl = [[UILabel alloc] init];;
    lbl.backgroundColor = [UIColor clearColor];  // This makes the background clear and just shows the text
    lbl.textColor = [UIColor whiteColor];  // Use any colour you wish
    lbl.alpha = 1.0; //0.5;
    lbl.tag = 42;
    lbl.font = [UIFont fontWithName:@"Helvetica-Bold" size:16.0];   // This is optional, I found this fond and size most readable
    [av addSubview:lbl];

    //Following lets the callout still work if you tap on the label...
    av.canShowCallout = YES;
    av.frame = lbl.frame;
} else {
    av.annotation = annotation;
}

UILabel *lbl = (UILabel *)[av viewWithTag:42];
// I added this to the text to improve its visibility by essentially adding a stroke around the text.  Well its a poor man's stroke by adding a shadow
lbl.layer.shadowColor = [[UIColor blackColor] CGColor];
lbl.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
lbl.layer.shadowOpacity = 1.0f;
lbl.layer.shadowRadius = 1.0f;

lbl.text = annotation.title;

return av;

}