地图高级 - 自定义大头针

地图高级 - 自定义大头针


地图高级 - 自定义大头针_第1张图片
自定义大头针.png

1. 理论支撑

按照MVC的原则
    1. 每当添加一个大头针数据模型时, 地图就会调用对应的代理方法, 查找对应的大头针视图,显示在地图上;
    2. 如果该方法没有实现, 或者返回nil, 那么就会使用系统默认的大头针视图

2. 模拟实现系统大头针

  1. 实现当添加大头针数据模型时,地图回调的代理方法

    -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(XXXAnnotation *)annotation
    {
    
    }
    
  2. 实现须知

     1. 大头针系统对应的视图是 MKPinAnnotationView,它继承自 MKAnnotationView
     2. 地图上的大头针视图,和tableview上的cell一样,都使用“循环利用”的机制
    
  3. 实现代码

    // 定义缓存标识
    static NSString *pinID = @"pinID";
    
    // 缓存中取大头针
    MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:pinID];
    
    // 缓存中不存在大头针,则创建
    if (!pinView) {
        pinView = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:pinID];
    }
    
    // 设置模型数据
    pinView.annotation = annotation;
    
    // 弹出标注
    pinView.canShowCallout = YES;
    
    // 修改大头针颜色
    pinView.pinColor = MKPinAnnotationColorPurple;
    
    // 设置大头针从天而降
    pinView.animatesDrop = YES;
    
    // 设置大头针可以被拖拽(父类中的属性)
    pinView.draggable = YES;
    
    return pinView;
    

3. 自定义大头针

  1. 实现当添加大头针数据模型时,地图回调的代理方法

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(XXXAnnotation *)annotation
{

}
```
  1. 实现须知

     1. 如果想要自定义大头针, 必须使用 MKAnnotationView 或者 自定义的子类
     2. 但是不能直接使用系统默认的大头针, 会无效
    
  2. 实现代码

        // 自定义大头针
        static NSString *pinID = @"pinID";
        MKAnnotationView *customPinView = [mapView dequeueReusableAnnotationViewWithIdentifier:pinID];
        if (!customPinView) {
            customPinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinID];
        }

        // 设置大头针图片
            customPinView.image = [UIImage imageNamed:@"category_3"];

        // 设置大头针可以弹出标注
            customPinView.canShowCallout = YES;

        // 设置标注左侧视图
            UIImageView *leftIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
            leftIV.image = [UIImage imageNamed:@"huba.jpeg"];
            customPinView.leftCalloutAccessoryView = leftIV;

        // 设置标注右侧视图
            UIImageView *rightIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
            rightIV.image = [UIImage imageNamed:@"eason.jpg"];
            customPinView.rightCalloutAccessoryView = rightIV;

        // 设置标注详情视图(iOS9.0)
            customPinView.detailCalloutAccessoryView = [[UISwitch alloc] init];

        return customPinView;

4. 代理方法补充

  1. 选中一个大头针时调用

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
NSLog(@"选中%@", [view.annotation title]);
}
```

  1. 取消选中大头针时调用

    -(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
        {
            NSLog(@"取消选中%@", [view.annotation title]);
        }
    

5. 其他方法补充

  1. 添加导航条上的用户追踪按钮
    navigationItem.leftBarButtonItem = MKUserTrackingBarButtonItem(mapView: mapView)
    

6. 测试环境

    1. 加载地图数据需要联网
    2. XCode版本不限
    3. iOS系统版本不限

7. 常见问题总结

    1. 代码运行在低版本的XCode上, 编译失败
        第一: 语法错误; XCode7.0 对于OC语法优化了一些, 需要手动调整
        第二: iOS9.0的SDK, 在XCode7.0之前的版本没有对应的API

你可能感兴趣的:(地图高级 - 自定义大头针)