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:@"建议您安装高德或者百度地图"];
    }
    
}

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

猜你喜欢

转载自www.cnblogs.com/widgetbox/p/9245012.html