地图与定位(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 }
时间: 2024-10-09 11:13:35