免费开源的iOS开发学习平台

MapKit框架:6-复杂地图标注示例

本节的示例代码,在MKMapView上实现了添加自定义样式的地图标注,该地图标注的图标使用自定义图片,点击图标后,可以在附加视图的左右两侧各添加一个按钮。

准备工作

在进行地图标注样式定制之前,需要提前完成如下代码的编写:

  • 初始化一个MKMapView类的对象,并设置属性;
  • 初始化一个MKPointAnnotation类的对象,设置其属性,并添加到MKMapView对象上;
  • 设置MKMapView对象的代理对象,通常为控制器对象,然后设置控制器对象遵守MKMapViewDelegate协议
  • 添加MKMapView到控制器视图上。

实现地图标注的定制

使用自定义样式的地图标注,需要在MKMapViewDelegate代理协议中的mapView:viewForAnnotation:方法中完成。

- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
    
    if ([annotation isKindOfClass:[MKPointAnnotation class]]) {
        MKAnnotationView *customAnnotationView = (MKAnnotationView*)[mapView                                                                   dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];
        if (customAnnotationView == nil){
            customAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation                                                            reuseIdentifier:@"CustomPinAnnotationView"];
        }
        //设置标注的图片
        customAnnotationView.image = [UIImage imageNamed:@"99logo"];
        //设置点击标注可以显示更多信息
        customAnnotationView.canShowCallout = YES;
        //右侧按钮定制
        UIButton *rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
        rightButton.backgroundColor = [UIColor redColor];
        [rightButton setTitle:@"前往" forState:UIControlStateNormal];
        customAnnotationView.rightCalloutAccessoryView = rightButton;
        //左侧按钮定制
        UIButton *leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
        leftButton.backgroundColor = [UIColor blueColor];
        [leftButton setTitle:@"详情" forState:UIControlStateNormal];
        customAnnotationView.leftCalloutAccessoryView = leftButton;
        return customAnnotationView;
    }
    return nil;
}

运行后,我们可以看到地图标注的样式如下所示:

示例代码

https://github.com/99ios/17.3.6