• iOS地图多个自定义大头针绘制核心代码


    首先需要自定义一个包含经纬度,title,subtitle的数据模型

    #import <Foundation/Foundation.h>
    #import <MapKit/MapKit.h>
    
    @interface NearBrandAnnotation : NSObject<MKAnnotation>
    
    @property (nonatomic) CLLocationCoordinate2D coordinate;
    @property (nonatomic, copy) NSString *title;
    @property (nonatomic, copy) NSString *subtitle;
    
    
    @end
    
    #import "NearBrandAnnotation.h"
    
    @implementation NearBrandAnnotation
    
    @end
    

     在controller中需要以下数据

    //地图
    #import "NearBrandAnnotation.h"
    #import <MapKit/MapKit.h>
    #import "MapAnnotation.h"
    

    遵守以下协议

    @interface NearBrandStoreVC ()<MKMapViewDelegate,UIActionSheetDelegate>{
        MKMapView *mapView;
        MKAnnotationView  *annotationView;
    }
    

     有以下属性

    @property (nonatomic, assign) CLLocationDegrees strLatitude;//经度
    @property (nonatomic, assign) CLLocationDegrees strLongitude;//维度
    

     开始流程

    1.创建地图

    #pragma mark -- 地图
    //标注目的地
    - (void)createMap{
        mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, _safeInsets.top+44+47, SCREEN_WIDTH, SCREEN_HEIGHT-_safeInsets.top-44-_safeInsets.bottom-47)];
        [self.view addSubview:mapView];
        mapView.hidden = YES;
        
        mapView.delegate = self;
        //用户位置追踪(用户位置追踪用于标记用户当前位置,此时会调用定位服务)
        mapView.userTrackingMode = MKUserTrackingModeFollow;
        //设置地图类型
        mapView.mapType=MKMapTypeStandard;
        //添加大头针
    
    }
    

     2.这是地图的代理方法之一-自定义大头针的样式,以及每个大头针的赋值

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
        
        //由于当前位置的标注也是一个大头针,所以此时需要判断,此代理方法返回nil使用默认大头针视图
        if ([annotation isKindOfClass:[NearBrandAnnotation class]]) {
            static NSString *key1=@"NearBrandAnnotation";
            annotationView=[mapView dequeueReusableAnnotationViewWithIdentifier:key1];
            //如果缓存池中不存在则新建
            if (!annotationView) {
                annotationView=[[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:key1];
                annotationView.canShowCallout=YES;//允许交互点击
                annotationView.calloutOffset=CGPointMake(0, 1);//定义详情视图偏移量
                UIButton * btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 50)];
                btn.backgroundColor = BLUECOLOR;
                [btn setTitle:@"到这去" forState:UIControlStateNormal];
                [btn addTarget:self action:@selector(turnAction:) forControlEvents:UIControlEventTouchUpInside];
                annotationView.rightCalloutAccessoryView=btn;//定义详情左侧视图
                annotationView.selected = YES;
               objc_setAssociatedObject(btn, @"annotation",annotation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
            }
            //修改大头针视图
            //重新设置此类大头针视图的大头针模型(因为有可能是从缓存池中取出来的,位置是放到缓存池时的位置)
            annotationView.annotation=annotation;
            annotationView.image=[UIImage imageNamed:@"brandPin"];//设置大头针视图的图片
            
            return annotationView;
        }else {
            return nil;
        }
    }
    

     下面是我们自己的列表数据---以及如何将地图的数据加载

    - (void)addAnnotations{
        NSMutableArray *addAnnotations = [NSMutableArray new];
        for (int i = 0; i< _nearBrandStores.count; i++) {
            YuQuanBrandJiaMengShangListModel *mdoel = _nearBrandStores[i];
            CLLocationCoordinate2D location = CLLocationCoordinate2DMake(mdoel.last_latitude.floatValue, mdoel.last_longitude.floatValue);
            
            NearBrandAnnotation *annotation=[[NearBrandAnnotation alloc]init];
            annotation.title= mdoel.store_name;
            annotation.subtitle= mdoel.address;
            annotation.coordinate=location;
            
    //        [mapView setCenterCoordinate:location zoomLevel:10 animated:NO];
            [addAnnotations addObject:annotation];
        }
        [mapView addAnnotations:addAnnotations];
    }
    

     其中,需要注意的是,数据的绑定,每个大头针对应一个我们获取到的数据模型,用于点击跳转的时候使用

    - (void)turnAction:(UIButton *)button{
        NearBrandAnnotation *annotation = objc_getAssociatedObject(button, @"annotation");
        _model = [YuQuanBrandJiaMengShangListModel new];
        _model.address = annotation.subtitle;
        _model.last_longitude = [NSString stringWithFormat:@"%f",annotation.coordinate.longitude];
        _model.last_latitude =  [NSString stringWithFormat:@"%f",annotation.coordinate.latitude];
        [self mapBtnclick];
    }
    

     下面就是上次的跳转三方地图了

    - (void)mapBtnclick{
        if (![NSString isNotEmptyString:_currentadress]) {
            [self.locationManager startUpdatingLocation];
            [SDIndicator showInfoWithMessage:@"正在定位,请稍候..."];
            return;
        }
        _actionSheet= [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:nil];
        NSMutableArray *mapsArray=[[NSMutableArray alloc] initWithCapacity:0];
        _mapsUrlArray=[[NSMutableArray alloc] init];
        NSURL * apple_App = [NSURL URLWithString:@"http://maps.apple.com/"];
        if ([[UIApplication sharedApplication] canOpenURL:apple_App]) {
            [mapsArray addObject:@"使用iPhone自带地图"];
            NSString *urlString=[NSString stringWithFormat:@"http://maps.apple.com/?saddr=%f,%f&daddr=%f,%f",_strLatitude,_strLongitude,[_model.last_latitude floatValue],[_model.last_longitude floatValue] ];
            [_mapsUrlArray addObject:urlString];
        }
        
        NSURL * baidu_App = [NSURL URLWithString:@"baidumap://"];
        if ([[UIApplication sharedApplication] canOpenURL:baidu_App]) {
            [mapsArray addObject:@"使用百度地图"];
            
            NSString *stringURL =[[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=latlng:%f,%f|name=%@&mode=driving&coord_type=gcj02",[_model.last_latitude floatValue],[_model.last_longitude floatValue],_model.address] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            [_mapsUrlArray addObject:stringURL];
            
        }
        
        NSURL * gaode_App = [NSURL URLWithString:@"iosamap://"];
        if ([[UIApplication sharedApplication] canOpenURL:gaode_App]) {
            [mapsArray addObject:@"使用高德地图"];
            NSString *urlString = [[NSString stringWithFormat:@"iosamap://path?sourceApplication=%@&sid=BGVIS1&slat=%f&slon=%f&sname=%@&did=BGVIS2&dlat=%f&dlon=%f&dname=%@&dev=0&t=0",@"龙巅鱼邻",_strLatitude,_strLongitude,_currentadress,[_model.last_latitude floatValue],[_model.last_longitude floatValue],_model.address] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            [_mapsUrlArray addObject:urlString];
            
        }
        
        for (int x=0; x<mapsArray.count; x++) {
            [_actionSheet addButtonWithTitle:[mapsArray objectAtIndex:x]];
            
        }
        
        if (_mapsUrlArray.count>0) {
            [_actionSheet showInView:self.view.window];
        }else{
            [SDIndicator showInfoWithMessage:@"建议您安装高德或者百度地图"];
        }
        
    }
    

     当然,跳转需要定位自己的经纬度,这个上一篇讲过了

  • 相关阅读:
    phpmyadmin和网页上面的乱码问题
    整理: Android HAL
    warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]-给char* 形参 传入 宏定义字符串
    ubuntu 输入法莫名其妙变繁体
    linux内核版本号添加字符/为何有时会自动添加“+”号以及怎么去掉
    Unable to handle kernel NULL pointer dereference at virtual address 00000000
    Ubuntu 18.04 安装 Samba 服务器及配置
    linux查看版本信息
    图解:电压掉电监测电路如何实现检测工作?
    精密全波整流+一阶RC滤波器检测市电电压
  • 原文地址:https://www.cnblogs.com/widgetbox/p/9245012.html
Copyright © 2020-2023  润新知