码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发——开发实战总结OC篇&地图与定位(LBS)-MapKit篇

时间:2015-09-24 14:33:30      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:

地图与定位(LBS)-MapKit篇 
 
 
一:MapKit基本介绍
  •  XIB
  • 代码
 
二:框架没有导入
技术分享
 
在Xcode5之后我们不需要在工程中导入苹果的框架,也就是,苹果会自动为神马导入,但是有几个前提
  • 1:你必须import这个框架
  • 2:你必须在项目中使用(需要第一个条件的支持)
只要上面每个条件不满足都会报上名的错误
 
 
三:基本属性的使用
 1     // 1.设置地图显示类型
 2     /**
 3         MKMapTypeStandard = 0,  // 标准
 4         MKMapTypeSatellite,     // 卫星
 5         MKMapTypeHybrid,        // 混合(标准+卫星)
 6         MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体卫星
 7         MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体混合
 8      */
 9     self.customMapView.mapType = MKMapTypeHybridFlyover;
10 
11 
12     // 2.设置地图的跟随模式
13     //(注意:设置此属性会使用到用户的位置隐私,所以需要请求用户授权,否则没有效果)
14     /**
15         MKUserTrackingModeNone = 0, // 不跟随
16         MKUserTrackingModeFollow, // 跟随用户位置
17         MKUserTrackingModeFollowWithHeading, // 跟随用户位置,并跟随用户方向
18      */
19     [self locationM];
20     self.customMapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
21 
22 
23     // 3.设置地图其它属性(操作)
24     /** 注意:设置对应的属性时,注意该属性是从哪个系统版本开始引入的,做好不同系统版本的适配*/
25     // 是否可以缩放
26     self.customMapView.zoomEnabled = NO;
27     // 是否可以滚动
28     self.customMapView.scrollEnabled = NO;
29     // 是否可以旋转
30     self.customMapView.rotateEnabled = NO;
31     // 是否显示3D
32     self.customMapView.pitchEnabled = NO;
33 
34     // 4.设置地图其它属性(显示)
35     // 是否显示指南针
36     self.customMapView.showsCompass = YES;
37     // 是否显示比例尺
38     self.customMapView.showsScale = YES;
39     // 是否显示交通
40     self.customMapView.showsTraffic = YES;
41     // 是否显示建筑物
42     self.customMapView.showsBuildings = YES;
43  

 

 

 
四:中级使用,地图的显示
 
 1     // 测试显示中国地图全貌(经度范围:73°33′E至135°05′E  纬度范围:3°51′N至53°33′N)
 2 //    MKCoordinateSpan span = MKCoordinateSpanMake(50, 64);
 3 //    CLLocationCoordinate2D center = CLLocationCoordinate2DMake(28, 104);
 4 //    MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
 5 //    [self.customMapView setRegion:region animated:YES];
 6 
 7     // 根据调整的合适区域跨度 设置地图的显示区域
 8     MKCoordinateSpan span = MKCoordinateSpanMake(0.064695, 0.040670);
 9     CLLocationCoordinate2D center = self.customMapView.region.center;
10     MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
11     [self.customMapView setRegion:region animated:YES];

 

 

 
实现对应的呃方法
 1 #pragma mark -MKMapViewDelegate
 2 -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
 3 {
 4     /**
 5      MKUserLocation : 被称作“大头针模型”,其实喊什么都行,本质就是一个数据模型,只不过此模型遵循了大头针要遵循的协议(MKAnnotation)
 6      location:  用户当前所在位置信息(CLLocation对象)
 7      title:     大头针标注要显示的标题(NSString对象)
 8      subtitle:  大头针标注要显示的子标题(NSString对象)
 9      */
10     // 根据用户当前位置的经纬度,设置地图显示中心
11     /**
12         存在弊端:地图显示比例过大,无法调整
13         解决方案:直接使用对应的调整地图“显示区域”的API
14      */
15 //    [mapView setCenterCoordinate:userLocation.coordinate animated:YES];
16     /**
17       MKCoordinateSpan 跨度解释:
18       latitudeDelta:纬度跨度,因为南北纬各90度,所以此值的范围是(0---180);此值表示,整个地图视图宽度,显示多大跨度
19       longitudeDelta:经度跨度,因为东西经各180度,所以此值范围是(0---360):此值表示,整个地图视图高度,显示多大跨度
20      注意:地图视图显示,不会更改地图的比例,会以地图视图高度或宽度较小的那个为基准,按比例调整
21      */
22 //    MKCoordinateSpan span = MKCoordinateSpanMake(0.1, 0.1);
23 //    MKCoordinateRegion region = MKCoordinateRegionMake(userLocation.coordinate, span);
24 //    [mapView setRegion:region animated:YES];
25 }
26 
27 // 当地图区域(跨度)改变时调用
28 -(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
29 {
30     NSLog(@"%f---%f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta);
31 }
32  

 

 
注:
 1     /**
 2      存在弊端:
 3         iOS8.0之前,地图不会自动滚到用户所在位置
 4      解决方案:
 5         当地图获取到用户位置之后,使用代码移动地图显示中心
 6         1. 设置地图代理,在地图获取用户位置代理方法中操作
 7         2. 可以设置地图显示中心/设置地图显示区域
 8      */
 9     self.customMapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
10  
11  
12  

 

五:高级使用(大头针)
使用自定义的大头针(因为系统的是只读的)
创建一个类继承自NSobject并且遵守 MKAnnotation协议就可以,然后再里面定义大头症中需要的属性
 
 1 // 大头针所在经纬度(订在地图哪个位置)
 2 @property (nonatomic, assign) CLLocationCoordinate2D coordinate;
 3 
 4 
 5 // 大头针标注显示的标题
 6 @property (nonatomic, copy, nullable) NSString *title;
 7 // 大头针标注显示的子标题
 8 @property (nonatomic, copy, nullable) NSString *subtitle;
 9 
10 
11 @property (nonatomic, assign) AnnotationType AT;
12  

 

 

这里需要一个枚举类型
1 typedef enum{
2     AnnotationTypeMovie,
3     AnnotationTypeHotel
4 } AnnotationType;
5  
6  

 


再需要使用大头针的方法类中,添加一个大头针
 1  
 2 
 3 
 4     // 获取当前触摸点在地图上的坐标
 5     UITouch *touch = [touches anyObject];
 6     CGPoint touchPoint = [touch locationInView:self.customMapView];
 7     // 将坐标转换为经纬度
 8     CLLocationCoordinate2D center = [self.customMapView convertPoint:touchPoint toCoordinateFromView:self.customMapView];
 9 
10     [self addAnnotationWithCoordinate:center];
11  
12  
13  
14 
15 // 根据经纬度坐标添加大头针
16 - (void)addAnnotationWithCoordinate:(CLLocationCoordinate2D)coordinate
17 {
18     XMGAnnotation *annotation = [[XMGAnnotation alloc] init];
19 
20     annotation.coordinate = coordinate;
21     annotation.title = @"捉妖记";
22     annotation.subtitle = @"呆萌的胡巴";
23     annotation.AT = AnnotationTypeHotel;
24     [self.customMapView addAnnotation:annotation];
25 
26 // TODO: 可以自己尝试使用反地理编码,获取当前经纬度所在位置信息,用作大头针标注的标题和子标题
27 
28 }

 

 

 
当我们不需要的时候,比如View不再显示的时候就需要移除这个大头针
1 // 移除地图上所有大头针
2 - (void)removeAllAnnotation
3 {
4     NSArray *annotations = self.customMapView.annotations;
5     [self.customMapView removeAnnotations:annotations];
6 }
7  

 


 
更新地图
 1 #pragma mark -MKMapViewDelegate
 2 -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
 3 {
 4     /**
 5      MKUserLocation : 被称作“大头针模型”,其实喊什么都行,本质就是一个数据模型,只不过此模型遵循了大头针要遵循的协议(MKAnnotation)
 6      location:  用户当前所在位置信息(CLLocation对象)
 7      title:     大头针标注要显示的标题(NSString对象)
 8      subtitle:  大头针标注要显示的子标题(NSString对象)
 9      */
10     userLocation.title = @"小码哥";
11     userLocation.subtitle = @"小码哥总部";
12 }
13  
14   
自定义大头针数据模型,实现选中和移动功能
 1 // 当添加大头针数据模型时,会调用此方法,获取对应的大头针视图。如果返回nil,则默认使用系统自带的大头针视图。
 2 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(XMGAnnotation *)annotation
 3 {
 4 
 5 // TODO: 将自定义大头针视图进行封装,完善自定义的大头针数据模型
 6 
 7     // 自定义大头针
 8     static NSString *pinID = @"pinID";
 9     MKAnnotationView *customPinView = [mapView dequeueReusableAnnotationViewWithIdentifier:pinID];
10     if (!customPinView) {
11         customPinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinID];
12     }
13 
14     // 设置大头针图片
15     NSString *imageName = nil;
16 
17     switch (annotation.AT) {
18         case AnnotationTypeMovie:
19             imageName = @"category_5";
20         case AnnotationTypeHotel:
21             imageName = @"category_3";
22             break;
23 
24         default:
25             break;
26     }
27     customPinView.image = [UIImage imageNamed:imageName];
28     // 设置大头针可以弹出标注
29     customPinView.canShowCallout = YES;
30     // 设置标注左侧视图
31     UIImageView *leftIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
32     leftIV.image = [UIImage imageNamed:@"huba.jpeg"];
33     customPinView.leftCalloutAccessoryView = leftIV;
34 
35     // 设置标注右侧视图
36     UIImageView *rightIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
37     rightIV.image = [UIImage imageNamed:@"eason.jpg"];
38      customPinView.rightCalloutAccessoryView = rightIV;
39 
40     // 设置标注详情视图(iOS9.0)
41 //    customPinView.detailCalloutAccessoryView = [[UISwitch alloc] init];
42 
43     return customPinView;
44 
45 
46 #pragma mark - 华丽的分割线------------当我们返回nil时,系统大致实现方案-----------------
47     return nil;
48 //     当我们返回nil时,系统大致实现方案如下
49 //     1. 大头针系统对应的视图是 MKPinAnnotationView,它继承自 MKAnnotationView
50 //     2. 地图上的大头针视图,和tableview上的cell一样,都使用“循环利用”的机制
51     static NSString *pinID = @"pinID";
52     MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:pinID];
53     if (!pinView) {
54         pinView = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:pinID];
55     }
56     pinView.annotation = annotation;
57 
58 // 弹出标注
59     pinView.canShowCallout = YES;
60 
61     // 修改大头针颜色
62     pinView.pinColor = MKPinAnnotationColorPurple;
63 
64     // 设置大头针从天而降
65     pinView.animatesDrop = YES;
66 
67     // 设置大头针可以被拖拽(父类中的属性)
68     pinView.draggable = YES;
69 
70 
71     return pinView;
72     return nil;
73 }
74 
75 // 选中一个大头针时调用
76 -(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
77 {
78     NSLog(@"选中%@", [view.annotation title]);
79 }
80 
81 // 取消选中大头针时调用
82 -(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
83 {
84     NSLog(@"取消选中%@", [view.annotation title]);
85 }
86 }

 


 
 
 


 

iOS开发——开发实战总结OC篇&地图与定位(LBS)-MapKit篇

标签:

原文地址:http://www.cnblogs.com/iCocos/p/4835148.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!