转自http://www.raywenderlich.com/zh-hans/36129/使用mapkit叠加图片和视图教程(1)
本文是由iOS Tutorial小组成员ChrisWagner撰写,他是一名软件工程爱好者,一直在努力做一名技术前沿的开发者。
注意:
- 对MapKit已经熟悉了?
如果你对MapKit已经熟悉了,并且你想要马上学习叠加图层的内容,你可以忽略(或略读)掉前面的内容,直接跳到“是什么样的一个view”小节—在这里我为你准备了一个启动项目。 - 对MapKit还是一个新手?如果你对MapKit还一无所知,那么请继续往下阅读,我将从最基础的内容开始在程序中添加一个地图!
苹果地图 VS Google 地图
在开始编码之前,我先来说一下关于苹果地图和Google地图的争议。
在iOS开始之初,苹果就提供了一个地图程序,这个地图程序的数据最初是由Google地图 API提供的。而在iOS6中一切都改变了,苹果打破了与Google之间的关系,发布了自己的地图程序,并且后端数据是由苹果自己提供的。
这对于博客、媒体、用户,甚至你的妈妈都是一个热议话题。有些说苹果已经完成了一个难以置信的工作,并且放弃Google,而选择自身作为地图提供者是一个正确的选择。而有些人则持想法的态度,他们认为这是苹果自从iPhone在2007问世以来,做的最糟糕的一个决定。
现在,如果你使用MapKit那么是在使用苹果地图。如果以前使用过MapKit,你会发现两个版本的API非常相似。
无论你的位置在哪里,在地图上总会有空间来展现更多的信息!因此,本文中你将学到如何使用苹果流行(无论是有名或者臭名昭著)的地图并添加你自己的相关信息。
开始
为了开始学习,先下载starterproject,这个工程提供了基本的一个程序,可以在iPhone和iPad上运行,工程里面有一些基本的导航—但是还没有地图!
在starter project中提供的界面包含一个UISegmentedControl控件,用来切换不同的地图类型(稍后即将实现),此外还有有个动作按钮—用来显示一个table画面(里面是一些选项列表),通过这个table中的选项可以控制那种地图特征会被显示出来。通过轻击table中的选项就可以对选项选中或者取消选中。然后轻击Done按钮就可以把这些选项列表隐藏掉。
PVMapOptionsViewControll
在Xcode中打开这个starterproject,编译并运行。我敢打赌,你对目前这个工程有点失望,因为你将看到的如下内容:
starter project非常的简单!如果你希望地图程序能做任何有用的事情,那么你需要为这个工程添加一个地图!
你知道去San Jose的道路吗?—添加一个MapView
为了在程序中添加一个MapView,首先请打开MainStoryboard_iPhone.storyboard文件。选择ParkMap View Controller,然后将一个MapView对象拖拽到view中,调整MapView以填满整个view,如下图所示:
现在打开MainStoryboard_iPad.storyboard文件,跟上面的操作步骤一样,添加一个MapView,然后调整一下这个MapView的位置以填满整个view。
现在你如果编译并运行程序的话,程序会crash掉,并且提示如下信息:
*** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperat |
这是因为你还没有把MapKit.framework链接到你的target中!
为了将其链接到target中,在工程导航栏中选择Park View工程,然后选中Park View target。下一步打开BuildPhases选项,然后在Link Library With Binaries下面单击+按钮,如下图所示:
在弹出的窗口中搜索MapKit,选中它,然后单击Add将其添加到工程中,如下截图所示:
现在编译并运行程序,可以看到新的地图了!看起来如下截图所示:
如上所示,在程序中添加一个地图并不需要做太多的工作。
在程序里面有一个地图是非常cool的,如果能让地图做一些实际的事情会更cool!:]下一节中,将介绍如何在程序中获得这个MapView,以进行交互。
又长又曲折的道路—连接到你的MapView
要想用MapView做任何事情,你需要做两件事情—将其与一个outlet关联,将viewcontroller注册为MapView的delegate。
但是首先你需要import MapKit头文件。打开PVParkMapViewController.h
#import <MapKit/MapKit.h>
|
下一步,打开MainStoryboard_iPhone.storyboard
在弹出的画面中,将outlet命名为mapView,,然后单击Connect。
现在你需要为MapView设置delegate。这样做:在MapView上右键单击,会弹出一个context菜单,然后将delegate连接到MapView Controller上,如下图所示:
现在对iPad storyboard做相同的操作 —将MapView连接到mapView插槽中(这次只需要将其拖拽到已经存在的插槽上即可,不需要创建一个新的),并将viewcontroller设置为MapView的delegate。
现在已经完成了插槽的连接,下面你还需要修改一下PVParkMapViewController头文件的接口声明,让其遵循MKMapViewDelegate协议。
最终PVParkMapViewController.h中的接口声明如下所示:
@interface PVParkMapViewController : UIViewController |
通过上面的操作,我们完成了插槽,delegate,controller的配置。现在可以在地图中添加一些交互了!
我在这里,你不知道如何从这而到那儿 – 与MKMapView进行交互
虽然地图默认的视图非常好看,但是这对于只关注主题公园(而不是所有的大陆)的人来说,使用起来太广泛了!当程序启动的时候,将公园的地图视图放置在程序的中间非常好。
获得某个具体位置的位置信息有许多中方法;可以通过web service获取,也可以将位置信息内置在程序中。
为了简单起见,在本文中,我把公园的位置信息打包放在程序中。下载这个工程的资源(resourcesfor this project),里面有一个名为MagicMountain.plist的文件,包含了公园的信息。
MagicMountain.plist的内容如下:
|