16、地图与定位(下)

解析.jpg

  了解一下解析的意思是什么。点击之后,会将下面显示的纬度和经度转换解析为一个地址名称(会显示在哪个国家)。这个操作是靠上一篇文章中在 BLFiveViewController.h 中的属性 @property(nonatomic, strong) CLGeocoder *geocoder;来实现的。(即地理位置的编码器) 方法如下 在 .m 文件中:

- (void)reversButtonClicked:(id)sender
{
    self.geocoder = [[CLGeocoder alloc] init];
    [self.geocoder reverseGeocoderLocation:self.currentLocation     // 将当前定位出来之后的位置传入,下一个参数是一个block 代码块
                         completionHandler:^(NSArray *placemarks, NSError *error) {// 这个符号 ^ 开头代表时一个 block 后面是 block 的参数,就是传入位置后会有一个代理回调,里面输入的就是代理要做的事情(比设置代理要更加简单)
                             if (error) {      // 解析失败
                                 NSLog(@"%@", error.description);
                             } else {
                                  if ([placemarks count] > 0) {
                                       CLPlacemark *placemark = [placemarks objectAtIndex:0]   // 一般只有一个坐标,所以解析出来也就一个实例
                                       _locationLabel.text = placemark.country;  // CLPlacemark 里面封装了很多属性,比如国家,国家代码,邮政编码,行政区域等等。根据需要选择
                                  }
                             }
                          }];
}

  接下来了解一下 block,如何定义 block, 然后就是如何调用 block :

typedef void (^UserInfoBlock)(NSString *);      // 前半部分是 block名字,后面是参数类型

- (void)test:(UserInfoBlock)uBlock
{
    uBlock(@"abc")
}

// 下面就是调用到 block
- (void)reversButtonClicked:(id)sender
{
    [self test:^(NSString *name) {
         NSLog(@"%@",name);
    };]
......
}

  下面需要了解一下声明是标柱,标柱其时就是 annotation ,它需要这些内容:坐标 coordinate(这是一个必选的代理方法,title & subtitle是可选的代理方法), title(徐汇区), subtitle(南丹路),还可以扩充一个 index的下标(这是项目中扩充的内容).


annotation.jpg

  首先,其实需要用到标注的话,需要先封装标注的类,上面的一段内容已经介绍了,下面是封装的代码演示,这个类的名称叫做 BLAnnotation .h & BLAnnotation.m :

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface BLAnnotation: NSObject<MKAnnotation>

@property(nonatomic, assign) CLLocationCoordinate2D coordinate;
@property(nonatomic, copy) NSString *title;
@property(nonatomic, copy) NSString *subtitle;

@property(nonatomic, assign) NSInteger index;

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate
                   title:(NSString *)title
                subtitle:(NSString *)subtitle
                   index:(NSInteger)index;

@end

  实现文件中是这样的:

#import "BLAnnotation.h"

@implementation BLAnnotatiom

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate
                   title:(NSString *)title
                subtitle:(NSString *)subtitle
                   index:(NSInteger)index;
{
     self = [super init]
     if (self) {
         self.coordinate = coordinate;
         self.title = title;
         self.subtitle = subtitle;
         self.index = index;
     }
    return self;
}

@end

  封装好之后的类需要数据才能生成对象,项目中老师在网上寻找到了三个地址的数据,输入必要的参数之后将它们放在了一个可变数组之中,在 BLFiveViewController.m 的 viewDidLoad() 方法中输入如下:

_annotations = [[NSMutableArray alloc] initWithCapacity:3];     // 创建地址库的一个实例对象,它的库存暂时可存放3个地址

// 接下来将这个三个坐标所对应的地址信息写入并在随后添加到刚创建的地址库当中
CLLocationCoordinate2D coordinate1 = {31.19434, 121.43203};
BLAnnotation *annotation1 = [[BLAnnotation alloc] initWithCoordinate:coordinate1 title:@"徐汇区" subtitle:@"广元西路" index:0];
[_annotation addObject:annotation1];

CLLocationCoordinate2D coordinate2 = {31.19190, 121.43304};
BLAnnotation *annotation2 = [[BLAnnotation alloc] initWithCoordinate:coordinate1 title:@"徐汇区" subtitle:@"东方曼哈顿" index:1];
[_annotation addObject:annotation2];

CLLocationCoordinate2D coordinate3 = {31.19223, 121.42847};
BLAnnotation *annotation3 = [[BLAnnotation alloc] initWithCoordinate:coordinate1 title:@"徐汇区" subtitle:@"南丹路" index:2];
[_annotation addObject:annotation3];

  在需要完成添加标注的功能,必须在所在类,实现添加标注的协议(_mapView.delegate = self;)。然后就是添加标注的方法,添加标注首先需要移出以前留下的标注信息,然后再添加:

- (void)flagButtonClicked:(id)sender
{
    [_mapView removeAnnotations:_mapView.annotations];
    [_mapView addAnnotations:_annotations];
}

  但是这两个方法还是不够的,因为一旦调用 addAnnotations: 这个方法,系统还会去调用 MKMapViewDelegate 这个代理方法,所以真正完成标注并且显示的是在这个代理方法中完成。代码如下 :

#pragma mark - MKMapViewDelegate methods

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if (![[annotation class) isSubclassOfClass:[BLAnnotation class]]) {      // 首先判断输入其中的是不是 BLAnnotation 对象,不是返回 nil
        return nil;
    }

    }
}

(未完待续)

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

推荐阅读更多精彩内容