iOS原生地图开发指南(一)

简介: iOS原生地图开发指南

iOS原生地图开发详解


在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760。对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博客主要对iOS官方的地图框架MapKit.framework进行介绍。


一、初始化地图视图与相关属性方法介绍


1、初始化地图视图


地图视图的展示依赖于MKMapView这个类,这个类继承于UIView,因此和其他View的使用方法类似。在我们需要展现地图的地方:


- (void)viewDidLoad {

   [super viewDidLoad];

   MKMapView * mapView =[[MKMapView alloc]initWithFrame:self.view.frame];

   [self.view addSubview:mapView];

}

运行发现,一张世界地图就在我们的设备上了,apple内置的地图数据是由高德提供的。


2、系统提供的三种地图样式


可以通过MKMapView的mapType这个属性设置地图的模式:


@property (nonatomic) MKMapType mapType;


枚举如下:


typedef NS_ENUM(NSUInteger, MKMapType) {

   MKMapTypeStandard = 0,//标准式的行政地图(会显示城市,街道等)

   MKMapTypeSatellite,//标准的卫星地图

   MKMapTypeHybrid//混合地图(在卫星图上显示街道等名称)

};

3、设置地图的中心和比例尺


在百度地图等第三方地图服务的SDK中,都会提供一个类似zoomLevel比例尺的属性。通过官方的API设置这个属性有些麻烦,但是也更加灵活。首先,设置地图的中心位置和比例尺是通过region这个属性实现的。region结构体如下:


typedef struct {

   CLLocationCoordinate2D center;//地图中心的经纬度

   MKCoordinateSpan span;//地图显示的经纬度范围

} MKCoordinateRegion;

这个结构体中包含了两个结构体,其中CLLocationCoordinate2D很好理解,就是简单的经纬度,解释如下:


typedef struct {

   CLLocationDegrees latitude;//纬度,北纬为正,南纬为负

   CLLocationDegrees longitude;//经度,东经为正,西经为负

} CLLocationCoordinate2D;

MKCoordinateSpan这个结构体比较复杂,如下:


typedef struct {

   CLLocationDegrees latitudeDelta;//纬度范围

   CLLocationDegrees longitudeDelta;//经度范围

} MKCoordinateSpan;

这个结构体定义的应该是一个范围,因为北纬南纬加起来180°,所以纬度范围的取值应为0-180。同理,经度范围的取值范围为0-360。


通过上面的介绍,我们举个例子,将北京市设为地图的中心区域,并且比例设置为显示北京大小。通过百度,首先知道北京市界的地理坐标为:北纬39”26’至41”03’,东经115”25’至 117”30’。北京市区坐标为:北纬39.9”,东经116. 3”。代码如下:


mapView.region=MKCoordinateRegionMake(CLLocationCoordinate2DMake(39.26, 116.3), MKCoordinateSpanMake(1.8, 2.05));

运行后可以看到,北京市基本上是在地图中心的,效果如下:

image.png



注意:MKCoordinateSpan的显示范围是取决于大的一边的,比如如果我们这样写:


MKCoordinateSpanMake(1.8, 360);

最后依然会显示整个世界地图。



- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;


这个方法可以在设置后给地图加上动画效果


@property (nonatomic) CLLocationCoordinate2D centerCoordinate;


设置地图的中心点位置


- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;


设置地图的中心点位置,并附带动画效果


4、坐标转换方法


- (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view;


将经纬度转换为视图上的坐标


- (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView *)view;


将视图上的坐标转换为经纬度


- (CGRect)convertRegion:(MKCoordinateRegion)region toRectToView:(UIView *)view;


将地理显示的区域转换为视图上的坐标区域


- (MKCoordinateRegion)convertRect:(CGRect)rect toRegionFromView:(UIView *)view;

将视图上的坐标区域转换为地理区域

目录
相关文章
|
1月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
166 4
|
iOS开发
Flutter与iOS原生通信方式
Flutter与iOS原生通信方式
491 2
|
JSON JavaScript 前端开发
iOS小技能: 开发 uni-app 原生插件(支持iOS Extension)
术语:uni原生插件指的是将`原生开发的功能按照规范封装成插件包`,然后即可在 uni-app 前端项目中通过js调用原生能力。
1167 0
iOS小技能: 开发 uni-app 原生插件(支持iOS Extension)
|
7月前
|
存储 移动开发 JavaScript
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
|
Dart 开发工具 Android开发
Flutter与iOS原生混合开发
Flutter与iOS原生混合开发
464 2
|
iOS开发 芯片 MacOS
macOS Big Sur 正式发布并已开放下载,支持原生运行 iOS 和 iPadOS App
macOS Big Sur 正式发布并已开放下载,支持原生运行 iOS 和 iPadOS App
225 0
|
移动开发 JavaScript weex
week-iOS的扩展之内置模块,将原生模块做成标签在weex中使用
week-iOS的扩展之内置模块,将原生模块做成标签在weex中使用
127 0
week-iOS的扩展之内置模块,将原生模块做成标签在weex中使用
|
JSON JavaScript 前端开发
iOS小技能: 开发 uni 原生插件(支持iOS Extension)
背景:app采用uni实现 需求: iOS App前台后台离线(杀死情况下)推送语音播报(到账xx元、收款播报、自定义推送铃)。 实现方式:uni-app 原生插件(支持iOS Extension)
494 0
iOS小技能: 开发 uni 原生插件(支持iOS Extension)
|
移动开发 前端开发 JavaScript
React Native | 原生IOS模块与JS通信,监听App被Kill
React Native | 原生IOS模块与JS通信,监听App被Kill
515 0
|
前端开发 iOS开发
React Native | 创建IOS原生模块
React Native | 创建IOS原生模块
381 0