开发 iOS 轻量版地图SDK 开发指南 在地图上绘制 绘制点标记

绘制点标记 最后更新时间: 2021年03月10日

标注可以精确表示用户需要展示的位置信息,高德地图SDK提供的标注功能允许用户自定义图标和信息窗,同时提供了标注的点击、拖动事件的回调。

SDK 提供的地图标注为MAAnnotation类,不同的标记可以根据图标和改变信息窗的样式和内容加以区分。 

添加默认样式点标记

iOS SDK提供的大头针标注MAPinAnnotationView,通过它可以设置是否支持长按后拖拽大头针改变坐标等。在地图上添加大头针标注的步骤如下:

(1) 修改ViewController.m文件,在mapReady地图初始化完成回调中添加如下所示代码添加标注数据对象。

MAPointAnnotation *pointAnnotation = [[MAPointAnnotation alloc] init];
pointAnnotation.coordinate = CLLocationCoordinate2DMake(39.989631, 116.481018);
pointAnnotation.title = @"方恒国际";
pointAnnotation.subtitle = @"阜通东大街6号";

[_map addAnnotation:pointAnnotation];
let anno = MAPointAnnotation()
anno.coordinate = CLLocationCoordinate2D.init(latitude: 39.989631, longitude: 116.481018)
anno.title = "方恒国际"
anno.subtitle = "阜通东大街6号"
map.addAnnotation(anno)

(2) 实现 <MAMapDelegate> 协议中的 map:viewForAnnotation:回调函数,设置标注样式。 如下所示: 

- (MAAnnotationView *)map:(MAMap *)map viewForAnnotation:(id <MAAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MAPointAnnotation class]])
    {
        annotationView = [[MAPinAnnotationView alloc] initWithAnnotation:annotation];
        annotationView.canShowCallout= YES;    //设置气泡可以弹出,默认为NO
        annotationView.draggable = YES;        //设置标注可以拖动,默认为NO
        return annotationView;
    }
    return nil;
}
func map(_ map: MAMap, viewFor annotation: MAAnnotation) -> MAAnnotationView! {
	if annotation.isKind(of: MAPointAnnotation.self) {
		let annotationView = MAPinAnnotationView.init(annotation: annotation)
		annotationView?.canShowCallout = true
		annotationView?.isDraggable = true
		annotationView?.rightCalloutAccessoryView = UIButton.init(type: UIButton.ButtonType.detailDisclosure)
		return annotationView!
	}   
    return nil
}

运行程序,在地图显示对应的标注点,点击标注弹出气泡,效果如图: 

添加自定义样式点标记

iOS SDK可自定义标注(包括 自定义标注图标 和 自定义气泡图标),均通过MAAnnotationView来实现。

自定义标注图标

若大头针样式的标注不能满足您的需求,您可以自定义标注图标。步骤如下:

(1) 添加标注数据对象,可参考大头针标注的步骤(1)。

(2) 导入标记图片文件到工程中。这里我们导入一个名为 restauant.png 的图片文件。

(3) 在 <MAMapDelegate>协议的回调函数map:viewForAnnotation:中修改 MAAnnotationView 对应的标注图片。示例代码如下: 

- (MAAnnotationView*)map:(MAMap *)map viewForAnnotation:(id <MAAnnotation>)annotation {
    if ([annotation isKindOfClass:[MAPointAnnotation class]])
    {
        MAAnnotationView *annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation];
        
        annotationView.image = [UIImage imageNamed:@"restaurant.png"];
        return annotationView;
    }
    
    return nil;
}
func map(_ map: MAMap, viewFor annotation: MAAnnotation) -> MAAnnotationView! {
    if annotation.isKind(of: MAPointAnnotation.self) {
		let annotationView = MAAnnotationView.init(annotation: annotation)
 
		annotationView?.image = UIImage.init(named: "restaurant")
		return annotationView!
	}
	return nil
}

运行程序,标注点变成了餐馆图标,如下所示: 

添加自定义气泡

气泡在iOS中又称为callout,它由背景和气泡内容构成:

自定义气泡

(1) 创建自定义弹出视图继承自MACustomCalloutView。

(2) 在 <MAMapDelegate>协议的回调函数map:viewForAnnotation:中修改 MAAnnotationView 对应的自定制气泡。示例代码如下: 

- (MAAnnotationView*)map:(MAMap *)map viewForAnnotation:(id <MAAnnotation>)annotation {
    if ([annotation isKindOfClass:[MAPointAnnotation class]])
    {
        MAAnnotationView *annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation];
        //打开允许弹出气泡
        annotationView.canShowCallout    = YES;
        annotationView.customCalloutView = self.calloutView;
        annotationView.image     = [UIImage imageNamed:@"restaurant.png"];
        return annotationView;
    }
    
    return nil;
}
func map(_ map: MAMap, viewFor annotation: MAAnnotation) -> MAAnnotationView! {
    if annotation.isKind(of: MAPointAnnotation.self) {
		let annotationView = MAAnnotationView.init(annotation: annotation)
 		annotationView?.canShowCallout = true
        annotationView?.customCalloutView = self.calloutView
		annotationView?.image = UIImage.init(named: "restaurant")
		return annotationView!
	}
	return nil
}

运行程序,如下所示: 


返回顶部 示例中心 常见问题 智能客服 公众号
二维码