ios地图锚点

1.话不多说,效果

Untitled2.gif

2.注意点

跟大家多唠叨一下,设置锚点的意义就是可以进行详情展示,大家可以设置锚点的样式。效果中的样式是一张图片,没有图片显示的就是我们俗称的大头针。
锚点.gif

3.代码展示

//地理编码
@property(nonatomic,strong)CLGeocoder *geocoder;
self.geocoder = [[CLGeocoder alloc]init];
    
//viewDidLoad
    //设置地图的显示风格
    self.mapView.mapType = MKMapTypeStandard;
    //设置地图可缩放
    self.mapView.zoomEnabled = YES;
    //设置地图可滚动
    self.mapView.scrollEnabled = YES;
    //设置地图可旋转
    self.mapView.rotateEnabled = YES;
    //设置显示用户当前位置
    self.mapView.showsUserLocation = YES;
    //为mapView设置代理
    self.mapView.delegate = self;
    
    [self locateTolatitude:23.126272 longitude:113.395568];
    
    //创建一个手势处理器,用于检测,处理长按手势
    //长按手势识别器
    UILongPressGestureRecognizer *longPressGes = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
    
    //为该控件添加手势
    [self.view addGestureRecognizer:longPressGes];
#pragma mark - 手势回调
-(void)longPress:(UILongPressGestureRecognizer *)gestu
{
    //获取长按点的坐标
    CGPoint pos = [gestu locationInView:self.mapView];
    
    //把获取到的坐标转换成经度纬度 值
    CLLocationCoordinate2D coor2D = [self.mapView convertPoint:pos toCoordinateFromView:self.mapView];
    //再把经纬度值添加到CLLocation(定位)对象
    CLLocation *location = [[CLLocation alloc]initWithLatitude:coor2D.latitude longitude:coor2D.longitude];
    
    //根据经纬度解析地址(反向解析)
    [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
       
        if (placemarks.count > 0) {
            CLPlacemark *placmark = placemarks[0];
            
            NSArray *addrArray = [placmark.addressDictionary objectForKey:@"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 = placmark.name;
            //设置子标题
            annotation.subtitle = address;
            //把坐标放入锚点里面
            annotation.coordinate = coor2D;
            //添加锚点
            [self.mapView addAnnotation:annotation];
        }
        
    }];
   
    
}
- (IBAction)gogogo:(id)sender {
    //关闭两个文本框的虚拟键盘
    [self.weidu resignFirstResponder];
    [self.jingdu resignFirstResponder];
    NSString* latitudeStr = self.weidu.text;
    NSString* longtitudeStr = self.jingdu.text;
    //如果用户输入的经纬度不为空
    if (latitudeStr != nil && latitudeStr.length > 0
        && longtitudeStr != nil && longtitudeStr.length > 0)
    {
        // 调用自己实现的方法设置地图的显示位置和显示区域
        [self locateTolatitude:latitudeStr.floatValue
                     longitude:longtitudeStr.floatValue];
    }
}
-(void)locateTolatitude:(CGFloat)latitude longitude:(CGFloat)longitude
{
    CLLocationCoordinate2D coor2D = {latitude,longitude};
    
        //设置地图的显示范围
        MKCoordinateSpan span;
        //地图显示范围越小,越清楚
        span.latitudeDelta = 0.01;
        span.longitudeDelta = 0.01;
        // 创建MKCoordinateRegion对象,该对象代表了地图的显示中心和显示范围。
        MKCoordinateRegion region = {coor2D,span};
        // 设置当前地图的显示中心和显示范围
        [self.mapView setRegion:region animated:YES];
    //将用户输入的经纬度封装成CLLocation对象
    CLLocation *location = [[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
    
    [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        
        //如果解析结果的集合元素大于1,表明解析得到了经度,维度信息
        if (placemarks.count > 0) {
            CLPlacemark *placmark = placemarks[0];
            NSLog(@"===%@",placmark.addressDictionary);
            //获取详细地址信息
            NSArray *addArr = [placmark.addressDictionary objectForKey:@"FormattedAddressLines"];
            //将详细地址拼接成一个字符串
            NSMutableString *addr = [[NSMutableString alloc]init];
            for (int i = 0; i < addArr.count; i ++) {
                [addr appendString:addArr[i]];
            }
            //创建MKPointAnnotation对象---代表一个锚点
            MKPointAnnotation *annotation = [[MKPointAnnotation alloc]init];
            //设置标题
            annotation.title = placmark.name;
            //设置子标题
            annotation.subtitle = addr;
            //把坐标放入锚点里面
            annotation.coordinate = coor2D;
            //添加锚点
            [self.mapView addAnnotation:annotation];

            
        }
        
    }];

    
    
}

#pragma mark -MKMapViewDelegate(地图代理)
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)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:@"锚点.gif"];
     // 设置该锚点控件是否可显示气泡信息
    annoView.canShowCallout = YES;
     // 定义一个按钮,用于为锚点控件设置附加控件
    //UIButtonTypeDetailDisclosure 详细说明蓝色小箭头按钮
    UIButton *b = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [b addTarget:self action:@selector(butomTape:) forControlEvents:UIControlEventTouchUpInside];
     // 可通过锚点控件的rightCalloutAccessoryView、leftCalloutAccessoryView设置附加控件
    annoView.rightCalloutAccessoryView = b;
    
    return annoView;
}
-(void)butomTape:(UIButton *)sender

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 223,207评论 6 521
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,455评论 3 400
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 170,031评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,334评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,322评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,895评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,300评论 3 424
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,264评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,784评论 1 321
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,870评论 3 343
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,989评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,649评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,331评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,814评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,940评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,452评论 3 379
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,995评论 2 361

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,352评论 25 707
  • 红烧肉佐以家长里短,提拉米苏在女孩子们的社交中占据一席之地,夏日的小龙虾们在昏黄的灯光下泛着油亮的光泽……食物...
    心里焦脆阅读 313评论 1 3
  • 小旺才: 昨天我们去看了电影《重返.狼群》,这部真实的纪录片深深撼动了我们的内心。 画面不多,不华丽,两个人一匹狼...
    樊里洋阅读 511评论 0 0
  • 一直记得小学那会,我风风火火,仗着自己成绩优异,没少干过“好事”,也深得一群兄弟。到高中发现自己脾气有些冲,就刻意...
    木木君的小日子阅读 219评论 2 2