美文网首页
地图自定义锚点+覆盖物

地图自定义锚点+覆盖物

作者: 繁华落尽终是殇 | 来源:发表于2017-08-31 10:57 被阅读0次

    导入系统库

    通过拖控件的方式:

    代码实现

    导入头文件

    #import< MapKit/MapKit.h>//地图

    #import <CoreLocation/CoreLocation.h>//定位

    添加  <MKMapViewDelegate > 协议

    @property (weak, nonatomic) IBOutlet MKMapView *mapView;

    @property (weak, nonatomic) IBOutlet UITextField *weiduTf;

    @property (weak, nonatomic) IBOutlet UITextField *jingduTf;

    //地理编码

    @property(strong,nonatomic)CLGeocoder *geocoder;

    - (void)viewDidLoad {

    [super viewDidLoad];

    //初始化地理编码

    _geocoder= [[CLGeocoder alloc]init];

    //设置地图的显示风格,此处设置使用标准地图

    self.mapView.mapType=MKMapTypeStandard;

    //设置地图可缩放

    self.mapView.zoomEnabled=YES;

    //设置地图可滚动

    self.mapView.scrollEnabled=YES;

    //设置地图可旋转

    self.mapView.rotateEnabled=YES;

    //设置显示用户当前位置

    self.mapView.showsUserLocation=YES;

    //调用自己实现的方法设置地图的显示位置和显示区域

    [self locateToLatitude:37.23 longitude:122.1234];

    //创建手势对象  (覆盖物手势)

    UITapGestureRecognizer *tap =[[UITapGestureRecognizer alloc]initWithTarget:self    action:@selector(tapAction:)];

    //配置属性

    //轻拍次数

    tap.numberOfTapsRequired =1;

    //轻拍手指

    tap.numberOfTouchesRequired =1;

    //添加到视图

    [self.view addGestureRecognizer:tap];

    // 创建一个手势处理器,用于检测、处理长按手势(锚点手势)

    UILongPressGestureRecognizer* gesture = [[UILongPressGestureRecognizer       alloc]initWithTarget:self action:@selector(longPress:)];

    //为该控件添加手势处理器

    [self.view addGestureRecognizer:gesture];

    //遵守代理是要实现自定义锚点

    self.mapView.delegate=self;

    }

    按钮方法

    - (IBAction)chazhao:(id)sender {

    //纬度

    NSString* latitudeStr =self.weiduTf.text;

    //经度

    NSString* longtitudeStr =self.jingduTf.text;

    //如果用户输入的经度、纬度不为空

    if(latitudeStr !=nil&& latitudeStr.length>0

    && longtitudeStr !=nil&& longtitudeStr.length>0)

    {

    //调用自己实现的方法设置地图的显示位置和显示区域

    [self locateToLatitude:latitudeStr.floatValue

    longitude:longtitudeStr.floatValue];

    }

    }

    手势方法

    #pragma mark --手势回调

    - (void) longPress:(UILongPressGestureRecognizer*)gesture{

    //获取长按点的坐标

    CGPoint pos = [gesture locationInView:self.mapView];

    //将长按点的坐标转换为经度、维度值

    CLLocationCoordinate2D coord = [self.mapView convertPoint:pos toCoordinateFromView:self.mapView];

    //将经度、维度值包装为CLLocation对象

    CLLocation* location = [[CLLocation alloc]initWithLatitude:coord.latitude

    longitude:coord.longitude];

    //根据经、纬度反向解析地址

    [_geocoder reverseGeocodeLocation:location completionHandler:

    ^(NSArray*placemarks,NSError*error)

    {

    if(placemarks.count>0&& error ==nil)

    {

    //获取解析得到的第一个地址信息

    CLPlacemark* placemark = [placemarks objectAtIndex:0];

    //获取地址信息中的FormattedAddressLines对应的详细地址

    NSArray* addrArray = placemark

    .addressDictionary[@"FormattedAddressLines"];

    //将详细地址拼接成一个字符串

    NSMutableString* address = [[NSMutableString alloc]init];

    for(int i =0; i < addrArray.count; i ++)

    {

    [address appendString:addrArray[i]];

    }

    //创建MKPointAnnotation对象——代表一个锚点

    MKPointAnnotation*annotation = [[MKPointAnnotation alloc]init];

    annotation.title= placemark.name;

    annotation.subtitle= address;

    annotation.coordinate= coord;

    //添加锚点

    [self.mapView addAnnotation:annotation];

    }

    }];

    }

    # pragma    点按手势回调

    //轻拍事件

    -(void)tapAction:(UITapGestureRecognizer *)tap

    {

    // 获取长按点的坐标

    CGPoint pos = [tap locationInView:self.mapView];

    // 将长按点的坐标转换为经度、维度值

    CLLocationCoordinate2D coord = [self.mapView convertPoint:pos

    toCoordinateFromView:self.mapView];

    // 创建MKCircle对象,该对象代表覆盖层

    MKCircle* circle = [MKCircle circleWithCenterCoordinate:coord radius:100];

    // 添加MKOverlay

    [self.mapView addOverlay:circle level:MKOverlayLevelAboveLabels];

    }

    自定义封装定位方法

    - (void)locateToLatitude:(CGFloat)latitude longitude:(CGFloat)longitude{

    //设置地图中心的经、纬度

    CLLocationCoordinate2D center = {latitude , longitude};

    //设置地图显示的范围,

    MKCoordinateSpan span;

    //地图显示范围越小,细节越清楚

    span.latitudeDelta=0.01;

    span.longitudeDelta=0.01;

    //创建MKCoordinateRegion对象,该对象代表了地图的显示中心和显示范围。

    MKCoordinateRegion region = {center,span};

    //设置当前地图的显示中心和显示范围

    [self.mapView setRegion:region animated:YES];

    //创建MKPointAnnotation对象——代表一个锚点

    MKPointAnnotation* annotation = [[MKPointAnnotation alloc]init];

    annotation.title=@"北京石羿科技发展有限公司";

    annotation.subtitle=@"海淀区中关村软件园";

    CLLocationCoordinate2D coordinate = {latitude , longitude};

    annotation.coordinate= coordinate;

    //添加锚点

    [self.mapView addAnnotation:annotation];

    }

    #pragma mark -自定义锚点

    // MKMapViewDelegate协议中的方法,该方法的返回值可用于定制锚点控件的外观

    - (MKAnnotationView*) mapView:(MKMapView*)mapView

    viewForAnnotation:(id) annotation{

    static NSString *annoId =@"fkAnno";

    //获取可重用的锚点控件

    MKAnnotationView *annoView = [mapView

    dequeueReusableAnnotationViewWithIdentifier:annoId];

    //如果可重用的锚点控件不存在,创建新的可重用锚点控件

    if(!annoView)

    {

    annoView= [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:annoId];

    /*

    如果不想改变锚点控件的图片,只想改变颜色,则可创建MKPinAnnotationView实例

    再修改MKPinAnnotationView对象的pinColor属性即可。

    */

    }

    //为锚点控件设置图片

    annoView.image= [UIImage imageNamed:@"1.png"];

    //设置该锚点控件是否可显示气泡信息

    annoView.canShowCallout=YES;

    //定义一个按钮,用于为锚点控件设置附加控件

    UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    //为按钮绑定事件处理方法

    [button addTarget:self action:@selector(buttonTapped:)

    forControlEvents:UIControlEventTouchUpInside];

    //可通过锚点控件的rightCalloutAccessoryView、leftCalloutAccessoryView设置附加控件

    annoView.rightCalloutAccessoryView= button;

    return annoView;

    }

    #pragma mark -自定义锚点--里面的详情按钮

    - (void) buttonTapped:(id)sender

    {

    NSLog(@"您点击了锚点信息!");

    }

    // MKMapViewDelegate协议中的方法,该方法返回的MKOverlayRenderer负责绘制覆盖层控件- (MKOverlayRenderer *)mapView:(MKMapView *)mapViewrendererForOverlay:(id)overlay

    {

    MKCircle * circle = (MKCircle*)overlay;

    // 创建一个MKCircleRenderer对象

    MKCircleRenderer* render = [[MKCircleRenderer alloc] initWithCircle:circle];

    // 设置MKCircleRenderer的透明度

    render.alpha = 0.5;

    // 设置MKCircleRenderer的填充颜色和边框颜色

    render.fillColor = [UIColor blueColor];

    render.strokeColor = [UIColor redColor];

    return render;

    }

    最终效果

    覆盖物效果

    相关文章

      网友评论

          本文标题:地图自定义锚点+覆盖物

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