地图篇-04.添加/删除大头针

地图篇-04.添加/删除大头针

博主这几天有点事,没有更新,还望海涵.

上一小节讲到展示地图,在展示地图的过程中,显示用户位置的时候是一个蓝色小圆点,但是朋友们觉得不好看,那弱弱的问一句,能换么?

肯定是能的啦.

1.准备

创建一个新项目,在storyboard中拖一个mapView,两个button,一个添加大头针,一个删除大头针,如下:

拖好了控件之后,简单搞下自动布局,然后把这3个控件拖入viewController.m中,不要忘记导入头文件和导入框架,这个前面讲过,这里不做细讲.

2.添加单个大头针

然后,上代码:

ViewController.m

 1 //
 2 //  ViewController.m
 3 //  删除大头针
 4 //
 5 //  Created by admin on 16/5/30.
 6 //  Copyright © 2016年 KXZDJ. All rights reserved.
 7 //
 8
 9 #import "ViewController.h"
10 #import <MapKit/MapKit.h>
11
12 @interface ViewController ()
13 @property (weak, nonatomic) IBOutlet MKMapView *mapView;
14
15 @end
16
17 @implementation ViewController
18
19 - (void)viewDidLoad {
20     [super viewDidLoad];
21
22 }
23
24 - (IBAction)addAnnotation:(id)sender {
25     //添加一个大头针,需要我们传一个id类型的参数,并且这个参数要遵守MKAnnotation这个协议
26     [self.mapView addAnnotation:<#(nonnull id<MKAnnotation>)#>];
27     //添加多个大头针,需要我们传一个数组,同样这个数组里面的元素也要是id类型的参数,并且这个参数也要遵守MKAnnotation这个协议
28     [self.mapView addAnnotations:<#(nonnull NSArray<id<MKAnnotation>> *)#>];
29
30 }
31
32 - (IBAction)deleteAnnotation:(id)sender {
33 }

因为不知道什么类型的参数,我们就自定义一个继承自NSObject的大头针模型,来做这个参数:

然后在MyAnnotation.h中导入头文件 #import <MapKit/MapKit.h>,在遵守<MKAnnotation>

到了这里,我们点进MKAnnotation里面去,看看有哪些要实现的方法和属性:

我们能看到有一个必须实现的属性,两个可选属性还有一个set方法,现在我们把这3个属性copy到.h文件中:

细心的朋友会发现在MKAnnotation这个协议中,这3个属性都是readOnly的,但是我们又要用,怎么办呢?把readOnly删除就好了.这里不纠结这个.

现在我们拿到这个属性了,不要多说,怎么用?看代码:

 1 //
 2 //  ViewController.m
 3 //  删除大头针
 4 //
 5 //  Created by admin on 16/5/30.
 6 //  Copyright © 2016年 KXZDJ. All rights reserved.
 7 //
 8
 9 #import "ViewController.h"
10 #import <MapKit/MapKit.h>
11 #import "MyAnnotation.h"
12
13 @interface ViewController ()
14 @property (weak, nonatomic) IBOutlet MKMapView *mapView;
15
16 @end
17
18 @implementation ViewController
19
20 - (void)viewDidLoad {
21     [super viewDidLoad];
22
23 }
24
25 - (IBAction)addAnnotation:(id)sender {
26     /*
27      先创建一个大头针:
28      */
29     //创建一个大头针
30     MyAnnotation *anno = [[MyAnnotation alloc] init];
31     //设置大头针位置
32     anno.coordinate = CLLocationCoordinate2DMake(30.39, 104.05);
33     //设置大头针名称
34     anno.title = @"成都市";
35     //设置大头针描述
36     anno.subtitle = @"成都市是四川省省会,人送外号天府之国";
37
38
39     //添加一个大头针,需要我们传一个id类型的参数,并且这个参数要遵守MKAnnotation这个协议
40     [self.mapView addAnnotation:anno];
41     //添加多个大头针,需要我们传一个数组,同样这个数组里面的元素也要是id类型的参数,并且这个参数也要遵守MKAnnotation这个协议
42 //    [self.mapView addAnnotations:<#(nonnull NSArray<id<MKAnnotation>> *)#>];
43
44 }
45
46 - (IBAction)deleteAnnotation:(id)sender {
47 }
48
49
50 @end

运行效果,点击添加大头针:

3.添加多个大头针

直接上代码:

 1 //
 2 //  ViewController.m
 3 //  删除大头针
 4 //
 5 //  Created by admin on 16/5/30.
 6 //  Copyright © 2016年 KXZDJ. All rights reserved.
 7 //
 8
 9 #import "ViewController.h"
10 #import <MapKit/MapKit.h>
11 #import "MyAnnotation.h"
12
13 @interface ViewController ()
14 @property (weak, nonatomic) IBOutlet MKMapView *mapView;
15
16 @end
17
18 @implementation ViewController
19
20 - (void)viewDidLoad {
21     [super viewDidLoad];
22
23 }
24
25 - (IBAction)addAnnotation:(id)sender {
26     /*
27      先创建一个大头针:
28      */
29     //创建一个大头针
30     MyAnnotation *anno = [[MyAnnotation alloc] init];
31     //设置大头针位置
32     anno.coordinate = CLLocationCoordinate2DMake(30.39, 104.05);
33     //设置大头针名称
34     anno.title = @"成都市";
35     //设置大头针描述
36     anno.subtitle = @"成都市是四川省省会,人送外号天府之国";
37
38
39     //创建一个大头针
40     MyAnnotation *anno1 = [[MyAnnotation alloc] init];
41     //设置大头针位置
42     anno1.coordinate = CLLocationCoordinate2DMake(39.54, 116.28);
43     //设置大头针名称
44     anno1.title = @"北京市";
45     //设置大头针描述
46     anno1.subtitle = @"北京市是中国政治经济文化中心";
47
48
49     //添加一个大头针,需要我们传一个id类型的参数,并且这个参数要遵守MKAnnotation这个协议
50 //    [self.mapView addAnnotation:anno];
51     //添加多个大头针,需要我们传一个数组,同样这个数组里面的元素也要是id类型的参数,并且这个参数也要遵守MKAnnotation这个协议
52     [self.mapView addAnnotations:@[anno,anno1]];
53
54 }
55
56 - (IBAction)deleteAnnotation:(id)sender {
57 }

运行效果图:

4.删除大头针

删除大头针的时候,也要根据你创建大头针的方法来删除,如果创建的一个,就删除一个,创建了多个,就删除数组,但是,在点击添加大头针的方法中创建的大头针,我们在删除大头针的方法中调用不了,就要定义成全局的实例变量或者写成属性,可是如果我们创建100个大头针呢?所以,这里我就用删除数组的方法来达到删除单个和多个的效果:

 1 //
 2 //  ViewController.m
 3 //  删除大头针
 4 //
 5 //  Created by admin on 16/5/30.
 6 //  Copyright © 2016年 KXZDJ. All rights reserved.
 7 //
 8
 9 #import "ViewController.h"
10 #import <MapKit/MapKit.h>
11 #import "MyAnnotation.h"
12
13 @interface ViewController ()
14 @property (weak, nonatomic) IBOutlet MKMapView *mapView;
15
16 @end
17
18 @implementation ViewController
19
20 - (void)viewDidLoad {
21     [super viewDidLoad];
22
23 }
24 //添加大头针
25 - (IBAction)addAnnotation:(id)sender {
26     /*
27      先创建一个大头针:
28      */
29     //创建一个大头针
30     MyAnnotation *anno = [[MyAnnotation alloc] init];
31     //设置大头针位置
32     anno.coordinate = CLLocationCoordinate2DMake(30.39, 104.05);
33     //设置大头针名称
34     anno.title = @"成都市";
35     //设置大头针描述
36     anno.subtitle = @"成都市是四川省省会,人送外号天府之国";
37
38
39     //创建一个大头针
40     MyAnnotation *anno1 = [[MyAnnotation alloc] init];
41     //设置大头针位置
42     anno1.coordinate = CLLocationCoordinate2DMake(39.54, 116.28);
43     //设置大头针名称
44     anno1.title = @"北京市";
45     //设置大头针描述
46     anno1.subtitle = @"北京市是中国政治经济文化中心";
47
48
49     //添加一个大头针,需要我们传一个id类型的参数,并且这个参数要遵守MKAnnotation这个协议
50 //    [self.mapView addAnnotation:anno];
51     //添加多个大头针,需要我们传一个数组,同样这个数组里面的元素也要是id类型的参数,并且这个参数也要遵守MKAnnotation这个协议
52     [self.mapView addAnnotations:@[anno,anno1]];
53
54 }
55
56 //删除大头针
57 - (IBAction)deleteAnnotation:(id)sender {
58
59     //删除单个大头针的方法
60 //    [self.mapView removeAnnotation:self.mapView.annotations[0]];
61     //删除多个大头针的方法,用这个也可以删除单个,所以不用上面的方法
62     [self.mapView removeAnnotations:self.mapView.annotations];
63 }
64
65
66 @end

以上就是添加和删除大头针的操作,那么现在问题来了,要是我不喜欢这个样式的大头针呢?以及我想点击屏幕任何位置添加大头针能做到么?

能!!!

图片资源自己去收集,想换什么换什么.

下面我们就讲讲怎么点击屏幕任何位置添加大头针,以及更换大头针样式:

5.随意添加大头针\更换大头针样式

首先,在写代码之前,理一下思路:

一>实现点击屏幕人一样地方添加大头针的思路:

5.1 要点击屏幕添加大头针,我们肯定要获取我们点击的位置,也就是坐标.

5.2 获取到我们点击的坐标之后,得把屏幕上的XY坐标转换成地理坐标吧.

5.3 转换成地理坐标之后,我们拿到coordinate这个坐标,是不是就可以添加大头针了.

我们知道点击屏幕会触发touchBegan这个方法,所以我们就在这个方法中写,代码:

 1 //点击屏幕的时候调用
 2 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
 3     //1.获取屏幕坐标
 4     CGPoint touchLocation = [[touches anyObject] locationInView:self.mapView];
 5     //2.屏幕坐标转换为地理坐标
 6     CLLocationCoordinate2D coordinate = [self.mapView convertPoint:touchLocation toCoordinateFromView:self.mapView];
 7     //3.添加大头针
 8     //创建一个大头针
 9     MyAnnotation *anno = [[MyAnnotation alloc] init];
10     //设置大头针位置
11     anno.coordinate = coordinate;
12     [self.mapView addAnnotation:anno];
13 }

运行效果图:

二>实现更改大头针样式

这里就要用到mapView的代理方法了,很简单,不多说,上代码上图:

MyAnnotation.h

 1 //
 2 //  MyAnnotation.h
 3 //  删除大头针
 4 //
 5 //  Created by admin on 16/5/30.
 6 //  Copyright © 2016年 KXZDJ. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10 #import <MapKit/MapKit.h>
11
12 @interface MyAnnotation : NSObject<MKAnnotation>
13
14 @property (nonatomic) CLLocationCoordinate2D coordinate;
15
16 @property (nonatomic, copy) NSString *title;
17
18 @property (nonatomic, copy) NSString *subtitle;
19 /**
20  *  大头针样式
21  */
22 @property (nonatomic, copy) NSString *icon;
23
24 @end

ViewController.m

  1 //
  2 //  ViewController.m
  3 //  删除大头针
  4 //
  5 //  Created by admin on 16/5/30.
  6 //  Copyright © 2016年 KXZDJ. All rights reserved.
  7 //
  8
  9 #import "ViewController.h"
 10 #import <MapKit/MapKit.h>
 11 #import "MyAnnotation.h"
 12
 13 @interface ViewController ()<MKMapViewDelegate>
 14 @property (weak, nonatomic) IBOutlet MKMapView *mapView;
 15
 16 @end
 17
 18 @implementation ViewController
 19
 20 - (void)viewDidLoad {
 21     [super viewDidLoad];
 22     //设置代理
 23     self.mapView.delegate = self;
 24
 25 }
 26 //添加大头针
 27 - (IBAction)addAnnotation:(id)sender {
 28     /*
 29      先创建一个大头针:
 30      */
 31     //创建一个大头针
 32     MyAnnotation *anno = [[MyAnnotation alloc] init];
 33     //设置大头针位置
 34     anno.coordinate = CLLocationCoordinate2DMake(30.39, 104.05);
 35     //设置大头针名称
 36     anno.title = @"成都市";
 37     //设置大头针描述
 38     anno.subtitle = @"成都市是四川省省会,人送外号天府之国";
 39     //设置大头针样式
 40     anno.icon = @"category_2";
 41
 42
 43     //创建一个大头针
 44     MyAnnotation *anno1 = [[MyAnnotation alloc] init];
 45     //设置大头针位置
 46     anno1.coordinate = CLLocationCoordinate2DMake(39.54, 116.28);
 47     //设置大头针名称
 48     anno1.title = @"北京市";
 49     //设置大头针描述
 50     anno1.subtitle = @"北京市是中国政治经济文化中心";
 51     //设置大头针样式
 52     anno1.icon = @"category_1";
 53
 54
 55     //添加一个大头针,需要我们传一个id类型的参数,并且这个参数要遵守MKAnnotation这个协议
 56 //    [self.mapView addAnnotation:anno];
 57     //添加多个大头针,需要我们传一个数组,同样这个数组里面的元素也要是id类型的参数,并且这个参数也要遵守MKAnnotation这个协议
 58     [self.mapView addAnnotations:@[anno,anno1]];
 59
 60 }
 61
 62 //删除大头针
 63 - (IBAction)deleteAnnotation:(id)sender {
 64
 65     //删除单个大头针的方法
 66 //    [self.mapView removeAnnotation:self.mapView.annotations[0]];
 67     //删除多个大头针的方法,用这个也可以删除单个,所以不用上面的方法
 68     [self.mapView removeAnnotations:self.mapView.annotations];
 69 }
 70
 71
 72 //点击屏幕的时候调用
 73 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
 74     //1.获取屏幕坐标
 75     CGPoint touchLocation = [[touches anyObject] locationInView:self.mapView];
 76     //2.屏幕坐标转换为地理坐标
 77     CLLocationCoordinate2D coordinate = [self.mapView convertPoint:touchLocation toCoordinateFromView:self.mapView];
 78     //3.添加大头针
 79     //创建一个大头针
 80     MyAnnotation *anno = [[MyAnnotation alloc] init];
 81     //设置大头针位置
 82     anno.coordinate = coordinate;
 83     [self.mapView addAnnotation:anno];
 84 }
 85
 86
 87
 88 #pragma mark - mapViewDelegate -
 89 /**
 90  *  添加大头针的时候调用
 91  *
 92  *  @param mapView    当前mapView
 93  *  @param annotation 大头针样式
 94  *
 95  *  @return 返回大头针的样式
 96  */
 97 -(MKAnnotationView*)mapView:(MKMapView *)mapView viewForAnnotation:(MyAnnotation *)annotation {
 98
 99    100        101 102
103     static NSString *ID = @"anno";
104     //创建MKAnnotationView的方式(因为这个方法返回一个MKAnnotationView,所以我们创建一个MKAnnotationView,创建方式类似于tableView的创建)
105     MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:ID];
106
107     //判断如果没有大头针视图
108     if (!annotationView) {
109         //那么就创建一个新的视图
110         annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];
111     }
112
113
114     //自定义大头针图片
115     annotationView.image = [UIImage imageNamed:annotation.icon];
116
117
118     return annotationView;
119
120
121     //如果返回nil,就会使用系统自带的样式
122 //    return nil;
123 }
124
125
126
127 @end

在上面的代理方法中,我把annotation的类型改成了我自己定义的类型:

运行效果图:

以上是添加/删除大头针,已经点击屏幕任意位置添加大头针和更改大头针样式的讲解,后面可能还会对这方面的知识做一个补充,相当于进阶.如有遗漏或错误,烦请指正.

时间: 2024-08-10 14:58:18

地图篇-04.添加/删除大头针的相关文章

iOS开发项目篇—04添加导航栏的按钮

iOS开发项目篇—04添加导航栏的按钮 一.设置导航栏的按钮 要求实现的效果:             说明:默认状态下和高亮状态下的图片是不一样的. 按钮的图片需要设置默认状态和高亮状态时的显示,系统了提供的下面方法 viewController.navigationItem.leftBarButtonItem=[UIBarButtonItem alloc]initWithImage:<#(UIImage *)#> style:<#(UIBarButtonItemStyle)#>

模仿百度地图的LBS服务——离线地图篇 Part 2 (v 3.1.1)

一.前言 转载请标明出处:http://blog.csdn.net/wlwlwlwl015/article/details/41492031 这一篇blog写的真心不容易,我只想说我这种菜鸟去高仿百度地图去做LBS服务真心有点作死,期间本想放弃,做简单点算了,但不能说服自己.最后通过F6去一行一行的debug(新手朋友注意这是最好的解决问题的方式没有之一),最后成功完成了核心的功能.上一篇blog高仿了百度地图离线地图模块中的"城市列表"部分(模仿百度地图的LBS服务--离线地图篇 P

Linux/Ubuntu中添加删除新用户

操作环境:Ubuntu Server 14.04,系统上仅有一个用户root 1. adduser 命令添加新用户 #adduser username 注意adduser与useradd命令的区别,useradd是Linux系统中二进制可执行程序工具,adduser是封装了useradd之后的可执行脚本.因此adduser比useradd功能更加强大和智能,adduser在创建用户同时进行创建用户主目录等其他相关工作. 2.赋予新建用户管理员权限 只需要将用户加入sudo用户组中就可以赋予用户管

地图篇-05.导航

地图篇-05.导航 上一节讲了大头针的一些知识,这节来讲讲导航,这个非常简单 步骤:  1.获取用户输入的地址 2.创建目的地在地图上的点   3.创建当前位置在地图上的点   4.调用系统自带的地图App导航 代码前准备: 拖入上图中三个控件,并且脱线到ViewController.m中 然后上代码: 1 // 2 // ViewController.m 3 // 05.导航 4 // 5 // Created by admin on 16/5/31. 6 // Copyright © 201

iOS进阶_地图上定位的标志——大头针

一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大头针类,我自定义的为MyAnnotation 大头针: 在iOS开发中经常会标记某个位置,需要使用地图标注,也就是大家俗称的“大头针”.只要一个NSObject类实现MKAnnotation协议就可以作为一个大头针,通常会重写协议中coordinate(标记位置).title(标题).subtitl

地图篇-01.获取用户位置

地图篇-01.获取用户位置 今天把地图整理了一下,共享出来和大家一起分享,希望帮助到不了解的朋友,当然很精通的朋友希望指正小生的不足. 1.说到地图,首先要接触一个framework -CoreLocation.framework 创建一个项目 点击"+"号之后,跳转到下个界面 导入完毕 2.原理: 大家平时在使用iPhone时,每下载一个App,第一次打开的时候,都会有这样的提示 是吧,这时候我们如果选择了不允许的话,这个App是获取不了我们的位置的,相应的App里面涉及到位置的功能

动态添加删除网卡 - 每天5分钟玩转 OpenStack(156)

这是 OpenStack 实施经验分享系列的第 6 篇. 在项目实施过程中,经常会有添加删除网卡的需求.比如一个运行数据库的 instance,初始只有一个网卡,数据库服务和备份共用这块网卡,后来为提高性能以及合规的要求需要加一块网卡专门做备份用.长久以来,Horizon 界面只支持在部署时为 instance 配置网卡,事后添加删除网卡只能用命令行,本节就来演示这个操作. 添加网卡 我们现在有一个 instance "c1",有一块 vlan111 的网卡,IP 为 17.17.11

编辑 Ext 表格(一)——— 动态添加删除行列

一.动态增删行 在 ext 表格中,动态添加行主要和表格绑定的 store 有关, 通过对 store 数据集进行添加或删除,就能实现表格行的动态添加删除. (1) 动态添加表格的行  gridStore.add({}); (2) 动态删除表格的行 gridStore.removeAt(gridStore.count() - 1); 二.动态增删列 在 ext 表格中,动态添加列主要通过修改表格绑定的 column 元素, 通过对 column 元素集进行添加或删除,然后重新渲染表格,就能实现表

iOS开发项目篇—02添加子控制器以及项目分层

iOS开发项目篇—02添加子控制器以及项目分层 一.添加子控制器 1.设置根控制器(自定义) 说明:分析新浪微博应用,观察其整体建构层次.而系统的控制器不能满足项目开发的需求,这里把项目中原有的控制器删除. 自己定义一个TabBarViewController类.让这个类作为window窗口的根控制器. YYAppDelegate.m文件代码: 1 #import "YYAppDelegate.h" 2 #import "YYTabBarViewController.h&qu