美文网首页iOS 深度好文
地图高级 - 自定义大头针

地图高级 - 自定义大头针

作者: 翻这个墙 | 来源:发表于2017-11-23 10:34 被阅读76次

    地图高级 - 自定义大头针


    自定义大头针.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
    

    相关文章

      网友评论

        本文标题:地图高级 - 自定义大头针

        本文链接:https://www.haomeiwen.com/subject/ndaavxtx.html