当前位置: 首页 > 科技观察

iOS9学习系列:MapKitTransit

时间:2023-03-13 21:29:12 科技观察

MapKit的每一次迭代都会给开发者带来一些新的特性,iOS9的更新也不例外。在本文中,我们将预览一些新的API。我们将在应用程序中使用它们来向您展示如何以编程方式估计到达时间。值得注意的新APIMapKit视图改进现在您可以在地图控件上指定更高级的布局和标记方法。MKAnnotation现在具有以下可自定义的属性。TitleSubtitleRightAccessoryViewLeftAccessoryViewDetailCalloutAccessoryViewDetailCalloutAccessoryView是iOS9中新增的功能。它允许您自定义细节附件视图。它支持自动布局和约束。自定义已有的注解非常方便。此外,一些新的、不言自明的属性已添加到MKMapView。如下:showsTrafficshowsScaleshowsCompassTransitImprovementsTransitImprovementsiOS9中新引入的MKDirectionsTransportType。到目前为止,它是唯一可以用来获取ETA请求的类。使用calculateETAWithCompletionHandler方法发起ETA请求时,可以得到一个MKETAResponse对象,包括派送时间、距离、预计到达时间、预计出发时间等数据。构建示例应用程序为了演示这些API,我们创建了以下应用程序。在此演示中,我们将演示点击的伦敦众多标记之一的公交相关信息。第一步是在故事板中创建MKMapView和UITableView,并添加一些必要的约束以确保地图控件位于页面的上半部分,表格视图位于页面的下半部分。完成后,将必要的元素添加到表单中。这里就不解释如何操作了,因为本文的重点不是这个。您需要确保ViewController是表的数据源和MKMapViewDelegate的委托。当您创建了所有这些UI后,它将如下所示。对于Storyboard,您需要自定义一个UITableViewCell。到目前为止,它非常简单。它们都是标签控件,在它们和故事板之间创建连接。代码1现在故事板已经创建,我们开始向地图添加一些标记。为此,我们需要添加几个目的地。创建一个Destination类来存储与位置相关的信息。代码2我们可以简单地创建一个目的地,如下所示。代码3我们添加了几个地址,保存到一个数组中,然后加载地图后用它们来显示。在ViewController的viewDidLoad()方法中,添加以下代码,将目的地标记添加到地图中。code4它们会显示在地图中,还需要初始化地图的起始地址。添加以下代码。code5接下来我们在表格中展示目的地的相关信息。code6运行程序,你会看到地图上已经标注了目的地,标注的目的地名称也显示在表格中。step1#p#这很好,但是我们还不能计算运输信息,因为我们还没有定义任何出发点。我们可以使用用户的地址,但我们希望获得真实的距离信息。因此,我们使用用户在地图上的点击作为起点。我们向地图控件添加一个点击手势。code7然后我们创建一个获取点击的方法,它将点击事件转化为地图上的坐标。code8当创建完成后,我们存储坐标以备后用。我们添加一个注释来显示用户的位置。如果之前存在,请先清除再添加。代码9***,我们需要将位置信息设置到表格的单元格中,然后更新ETA信息。首先添加如下代码:代码10同样,我们还需要复制表格的tableView:cellForRowAtIndexPath方法,以保证表格重新加载时数据能够正确显示。添加如下代码:代码11坐标正确赋值给tableviewcell后,我们需要更新相关信息。我们可以调用userCoordinate的didSet属性来设置更新。首先,我们需要清理一下使用过的标签的信息,因为之前的所有显示信息都不再需要了。code12现在我们有一个用户设置的坐标作为起始位置,我们可以创建一个MKDirectionsRequest对象来计算ETA信息。我们设置MKMapItem的属性,设置初始化坐标,设置终点坐标,并设置transportType。***,我们在calculateETAWithCompletionHandler中获取ETA信息,然后更新label的值。code13现在,运行程序,你会得到如下效果。result当你点击地图某处时,对应表中的ETA信息发生变化。最后一件事,响应“查看路线”按钮的事件。在IBAction中添加以下代码:code14这将显示目的地并在打开的地图应用程序中显示导航路线。自定义Pin颜色应用程序现已完成,但仍有一些小问题。无法分辨哪些是我们显示的,哪些是用户点击的坐标。为了自定义pin的显示,我们将MKMapViewDelegate的代理指定为ViewController,并实现其协议。添加如下代码:代码15pinTintColor是iOS新引入的属性,可以设置pin的颜色。可以看到,我们将用户点击的pin坐标的颜色设置为红色。将您在开始时设置的目的地的引脚颜色设置为蓝色。这样,可以很容易的区分出用户设置的起点和预设的终点。进一步阅读要了解有关我们在本文中提到的新MapKit功能的更多信息,请观看WWDC2015session206,MapKit的新功能。另外,你可以在github上下载本文的demo。