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

地图与定位(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

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

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

地图与定位(LBS)-CoreLocation篇 一:地图与定位基本框架(MapKit时基于CoreLocation实现的夜可以实现定位) 二:开发常用技术 LBS:基于位置的服务 SoLoMo:社交,本地,移动化 三:定位授权提示(iOS之前) 四:每个一段距离定位 五:后台服务:默认只能在前台服务 plist文件中 对应plist文件的值(数组) 六:基于基站定位 七:iOS8以上的服务 前台定位 定位服务开启 开启授权 后台服务(可以不勾选后台模式) 定位服务开 开启后台授权 授权改变 /

iOS开发——项目实战技术OC篇&XMPP简单总结

XMPP简单总结 最近面试被问到了一个问题,笔者当时就懵了:什么XMPP,平时怎么使用,使用过程中遇到什么问题?. 但是还是通过记忆,简单的说了一下自己所知道了,不过那并没有撒卵用,所以你懂的 XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具,大大简化了基于XMPP的通信应用的开发. 1.关于连接的 1 //此方法在stream开始连接服务器的时候调用 2 - (void)xmppS

iOS开发范例实战宝典(进阶篇)——互动出版网

这篇是计算机类的优质推荐>>>><iOS开发范例实战宝典(进阶篇)> 以最新的IOS 8为版本编写,内容覆盖了IOS开发的方方面面,通过大量实例提升实战技能,并对书中的重点和难点进行了专门分析. 编辑推荐 *以最新的iOS 8为版本编写,内容覆盖了iOS开发的方方面面* *通过200多个实例提升实战技能,并对书中的重点和难点进行了专门分析 *注重实战:详细讲解了117个iOS开发经典实例,提高实战开发水平 *内容全面:全面介绍了iOS开发中最为常见的14类界面模块 *由

iOS开发范例实战宝典(基础篇)——互动出版网

这篇是计算机类的优质推荐>>>><iOS开发范例实战宝典(基础篇)> 以最新的IOS 8为版本编写,内容覆盖了IOS开发的方方面面,通过大量实例提升实战技能,并对书中的重点和难点进行了专门分析. 编辑推荐 *以最新的iOS 8为版本编写,内容覆盖了iOS开发的方方面面* *通过200多个实例提升实战技能,并对书中的重点和难点进行了专门分析 *注重实战:详细讲解了117个iOS开发经典实例,提高实战开发水平 *内容全面:全面介绍了iOS开发中最为常见的14类界面模块 *由

iOS项目开发实战——获取网页源代码的二进制数据

我在上一篇博客<iOS项目开发实战--iOS网络编程获取网页Html源代码>中讲述了如何获取一个网页的HTML源代码,可以满足一定的需求.但是由于特殊原因,我们想获取的是一个网页的二进制数据,那么应该怎么办呢? 具体实现如下: (1)创建一个iOS项目,Language选择Swift,然后在ViewController.swift 中写入如下代码: override func viewDidLoad() { super.viewDidLoad() var data = NSData(conte

iOS项目开发实战——设置视图的透明度改变动画

在iOS中 ,透明度的改变可以让View视图以一种渐变的效果动态的出现或者消退,非常有意思.这里我们将会对一个View控件的色块执行透明度改变的动画.关于其他的动画效果可以参考我的其他几篇博客<iOS项目开发实战--制作视图的平移动画以及解决移动异常问题>,<iOS项目开发实战--多个视图的平移动画与闭包函数的声明与调用>. (1)在Main.storyboard中拖入一个View,并且绑定到代码中. (2)实现代码如下: import UIKit class OpacityVie

iOS项目开发实战——配置自定义动画

动画很多的属性,如位置,透明度等,开发者可以根据这些属性来自定义自己需要的动画.现在我们来简单实现如何自定义动画,以视图的透明度的变化为例.其他的动画效果可以参考我的其他两篇博客<iOS项目开发实战--视图动画效果><iOS项目开发实战--实现视图切换动画>. (1)同样也在Images.xcassets中拖入一张图片,然后在 Main.storyboard中使用一个ImageView控件来包含这张图片.并且绑定控件到代码中. (2)然后在ViewController中实现代码如下

ArcGIS Runtime for Android开发教程V2.0(8)基础篇-----地图事件

转自:http://blog.csdn.net/arcgis_mobile/article/details/8263283 ArcGIS Runtime sdk for Android为我们提供了丰富的事件监听器,本节将主要介绍我们经常使用的监听器,并且介绍通过这些监听器可以实现哪些功能,在下面的监听器中只有MapOnTouchListener是类,其他皆为接口类型,如图所示: 1.1 MapOnTouchListener MapOnTouchListener是MapView最为重要的监听器之一

iOS项目开发实战——storyboard设置界面技巧与注意事项

在iOS开发中,使用Main.storyboard来设计界面是每一个iOS开发人员需要面对的问题,使用storyboard相比较Android中使用XML来设置布局,有优点也有缺陷,现在我们来谈谈storyboard的设计技巧. (1)直接使用鼠标右键可以直接缩放storyboard的缩放比例.当然你也可以用触摸板使用2根手指缩放. . (2)拖拽控件绑定到代码中,不一定要从设计界面的控件中进行拖拽,也可以直接从左侧的列表中拖拽,这样会更加清晰方便. . (3)如何添加修改超过一屏的控件.我们把