使用MapKit叠加图片和视图教程(1)

转自http://www.raywenderlich.com/zh-hans/36129/使用mapkit叠加图片和视图教程(1)

本文是由iOS Tutorial小组成员ChrisWagner撰写,他是一名软件工程爱好者,一直在努力做一名技术前沿的开发者。

使用MapKit在程序中添加一个地图是非常容易的事。不过,如果你希望使用自己的注解和图片来装饰或者定制苹果提供的地图呢?
非常幸运的是苹果提供了非常容易的方法来完成这样的需求:自定义叠加图层。
在本文中,你将为 六七魔术山(SixFlags Magic Mountain)游乐园创建一个程序。如果你在洛杉矶是一个做过山车的粉丝,你会喜欢这个程序的:]
想想,一个来到游乐园的游人都会喜欢这个程序的一些功能:例如具体景点的位置,各种过山车的路线,以及公园的一些特点。这些内容的显示通过定制一个叠加图片是非常好的选择——这真是本文要介绍的内容。

注意: 根据你的经验水平,学习本文,你有两种选择:

  1. 对MapKit已经熟悉了? 如果你对MapKit已经熟悉了,并且你想要马上学习叠加图层的内容,你可以忽略(或略读)掉前面的内容,直接跳到“是什么样的一个view”小节—在这里我为你准备了一个启动项目。
  2. 对MapKit还是一个新手?如果你对MapKit还一无所知,那么请继续往下阅读,我将从最基础的内容开始在程序中添加一个地图!

苹果地图 VS Google 地图

Apple Maps no longer uses Google Maps!

在开始编码之前,我先来说一下关于苹果地图和Google地图的争议。

在iOS开始之初,苹果就提供了一个地图程序,这个地图程序的数据最初是由Google地图 API提供的。而在iOS6中一切都改变了,苹果打破了与Google之间的关系,发布了自己的地图程序,并且后端数据是由苹果自己提供的。

这对于博客、媒体、用户,甚至你的妈妈都是一个热议话题。有些说苹果已经完成了一个难以置信的工作,并且放弃Google,而选择自身作为地图提供者是一个正确的选择。而有些人则持想法的态度,他们认为这是苹果自从iPhone在2007问世以来,做的最糟糕的一个决定。

现在,如果你使用MapKit那么是在使用苹果地图。如果以前使用过MapKit,你会发现两个版本的API非常相似。

无论你的位置在哪里,在地图上总会有空间来展现更多的信息!因此,本文中你将学到如何使用苹果流行(无论是有名或者臭名昭著)的地图并添加你自己的相关信息。

开始

为了开始学习,先下载starterproject,这个工程提供了基本的一个程序,可以在iPhone和iPad上运行,工程里面有一些基本的导航—但是还没有地图!

在starter project中提供的界面包含一个UISegmentedControl控件,用来切换不同的地图类型(稍后即将实现),此外还有有个动作按钮—用来显示一个table画面(里面是一些选项列表),通过这个table中的选项可以控制那种地图特征会被显示出来。通过轻击table中的选项就可以对选项选中或者取消选中。然后轻击Done按钮就可以把这些选项列表隐藏掉。

PVMapOptionsViewController负责管理选项视图,稍后你将看到,在里面定义了一个非常重要的enum。这个类中剩余的代码则超出了本文的介绍范围。不过,如果你希望了解更多关于UITableView的知识,那么可以看一下这里的内容:UITableViewtutorials 

在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 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named MKMapView'

这是因为你还没有把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 文件,并将AssistantEditor打开,让PVParkMapViewController.h 可见.。然后从mapview control-drag到下面的第一个属性,如下图所示:

Add MapView Outlet

在弹出的画面中,将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的内容如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值