绘制点标记 最后更新时间: 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
}
运行程序,如下所示: