地图与定位(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 }
复制代码

 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【课程特点】1、231节大容量课程:包含了SwiftUI的大部分知识点,详细讲解SwiftUI的方方面面;2、15个超级精彩的实例:包含美食、理财、健身、教育、电子商务等各行业的App实例;3、创新的教学模式:手把手教您SwiftUI用户界面开发技术,一看就懂,一学就会;4、贴心的操作提示:让您的眼睛始终处于操作的焦点位置,不用再满屏找光标;5、语言简洁精练:瞄准问题的核心所在,减少对思维的干扰,并节省您宝贵的时间;6、视频短小精悍:即方便于您的学习和记忆,也方便日后对功能的检索;7、齐全的学习资料:提供所有课程的源码,在Xcode 11 + iOS 13环境下测试通过; 更好的应用,更少的代码!SwiftUI是苹果主推的下一代用户界面搭建技术,具有声明式语法、实时生成界面预览等特性,可以为苹果手机、苹果平板、苹果电脑、苹果电视、苹果手表五个平台搭建统一的用户界面。SwiftUI是一种创新、简单的iOS开发中的界面布局方案,可以通过Swift语言的强大功能,在所有的Apple平台上快速构建用户界面。 仅使用一组工具和API为任何Apple设备构建用户界面。SwiftUI具有易于阅读和自然编写的声明式Swift语法,可与新的Xcode设计工具无缝协作,使您的代码和设计**同步。自动支持动态类型、暗黑模式、本地化和可访问性,意味着您的**行SwiftUI代码已经是您编写过的非常强大的UI代码了。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值