iOS开发新家入门 | 第八章:地图和位置

By admin in 亚洲必赢app在哪下载 on 2018年9月16日

在即时同样回节中,你拿会学到以你的app中哪些下iPhone中的GPS。你以见面学会如何收获用户之职务,同时在地图上标有位置。本章内容涵盖了
地图套件(Map
Kit)和苹果公司供的地形图、方向框架。通过学习本章节的情,你及时便可以搞定基于位置一定的施用。

供用户的岗位信息是出iOS应用最冲动的特征,在地图上显示用户的个需要简单独步骤。

先是步用Core Location来收集用户的岗位。Core
Location是同等系列类的集合,通过设备的GPS和蜂窝获取位置信息,还会依赖WIFI获取用户信息。Core
Location
是由于苹果商店供的众frameworks中的一个。Frameworks是如出一辙组类的聚集,为具体的之一任务要计划的相同模仿工具。我们本因此Core
Location举一个例,Core
Location是为处理用户位置信息而计划之一个framework。Core
Data是为了处理多少要设计之一个framework。这些framework是可选的,因此用事先拿这些框架导入到工程中后,才会运用这些框架。

亚步是在地图中标注出用户之职。苹果公司供了Map
Kit框架,帮助我们绘制和治本地图。在Xcode
6中导入框架非常容易。首先Project
Navigator中点击项目名称,点击名为Capabilities的tab选项按钮,向下滚动找到Maps。将地图的初始要处On的状态,这时MapKit框架已补给加到工程中了。现在虽然能当工程被找到MapKit,但是导入流程还无得。MapKit还欲导入controller
file中。我们下列一行代码完成导入工作:

import MapKit

然,MapKit类和商事便导入到controller文件中了。MapKit中之好像及情商还是坐MK开头的。

Page 213

Core Location

正好使之前所说的,Core Location是平雨后春笋查找用户位置的类的集结。Core
Location中产生三只检测用户位置的法。第一独主意是Significant-Change
Location。这个主意能节约电池电量,它仅仅以用户的位置明显改观时才会更新位置。第二只艺术是Location
Services,可以独立规定稳定更新的条条框框。最后一种植方法是Regional
Monitoring方法,使用附近的地理区域界线或Bluetooth
beacons来定位。本书要介绍第二种植方式:Location
Services,它是最常用到的主意。

复多信息要参见苹果商店的Location and Maps Programming
Guide。

获用户位置要用Core Location框架,当你管Maps
capabilities开关切换成On(开)状态时,Xcode并无机关导入Core
Location框架,需要我们手动导入,请圈之下四只步骤:

  1. 点击Project Navigator上之蓝色工程图标;
  2. Editor显示工程的详细信息,滑倒最下方;
  3. 当Link Binary with Libraries下方点击Add;
  4. 慎选Core Location,然后点击Add。

Core Location框架就会加加至Project
Navigator中,我们尚需在controller中写一行代码才会得到之框架:

import CoreLocation

手机用户的位置十分耗电量,它比其余的天职要再次多的电池电量和天线频率,所以管您的App只有在需要位置时才取得位置,一旦得到岗位,就把此力量关闭,如果未来尚待地理位置,可以下年限更新功能

于得用户位置之前,很重大之均等起事是先期反省一定服务是否可用。定位服务无法运用或是由以下几栽情形:

  • 用户在安中关闭了Location Services(定位服务)。
  • 用户禁止你的App使用Location Services(定位服务)。
  • 设备处飞行模式或者连续不了网络。

Page 214 | Chapter 8 : Maps and Location

Core
Location提供了名叫吧locationServicesEnabled的章程来检查设备的稳服务是否可用,locationServicesEnabled方式通过布尔项目返回值来确定定位服务是否可用,true可用,false不可用。

Requesting User Location

透过CLLocationManager类来请求用户位置。首字母CL代表Core Location。The
location
manager用于采集参数和开定位服务。创建CLLocationManager对象同创建其他的靶子类似。举例说明:

var locationManager: CLLocationManager = CLLocationManager()

CLLocationManager有一部分性能是必要设置的。

desiredAccuracy属性是枚举类型,枚举,就是之所以一个重要词代表一个数字。枚举有点像是差不多选题,你不能不由选择中选取有一个值来。desiredAccuracy属性有脚有值:

kCLLocationAccuracyBest
最精准的永恒,也是最最消耗电量的挑三拣四
kCLLocationAccuracyNearestTenMeters
精准度在十米范围外
kCLLocationAccuracyHundredMeters
准确度在一百米范围外
kCLLocationAccuracyKilometer
精确度在一千米范围外
kCLLocationAccuracyThreeKilometers
精确度在三千米范围外

精准度越强,电量消耗越充分。我们设挑能够满足低要求的精准度级别。如果是比如说Google地图之类的App来追踪用户的职务,那么kCLLocationAccuracyNearestTenMeters或者kCLLocationAccuracyHundredMeters不怕足以满足我们的要求。如果App只待提供用户所在城市,像是Twitter中的稳,kCLLocationAccuracyKilometer或者kCLLocationAccuracyThreeKilometers即可以满足我们的需要。大多数情景下,一般不待kCLLocationAccuracyBest

安装desiredAccuracy属性的办法与安任何对象的属性一样:

locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters

Core Location | Page 215

CLLocationManager也待delegate属性。CLLocationManage
delegate遵循CLLocationManagerDelegate协议。无论何时起了岗位更新或者出现错误,delegate都见面接到到警示。为了接收这些警告,delegate必须通过CLLocationManagerDelegate协议以及警报保持联络。controller必须声明遵循协议,将CLLocationManagerDelegate添加到类的顶部:

class ViewController: UIViewController, CLLocationManagerDelegate

顾念只要接纳定位警高,要使locationManager(_:,didUpdateLocations:)道。每当定位信息变更的时,这个艺术就是会受调用:

func locationManger(manager: CLLocationManager!,didUpdateLocations locations: [AnyObject]!) {
    println("Location found")
}

怀念如果在其他时刻都能接收Core
Location的缪警告,需要采用locationManager(_: didFailWithError:)方法:

func locationManager(manager: CLLocationManager!, didFailWithError error:NSError!) {
    println("Error!")
}

使以协议并利用其中的方后,就不能不使装delegate的性:

locationManager.delegate = self

当激活定位服务之前,
用户须允许app使用用户之职务信息。定位服务产生点儿种植特许项目。第一种是requestWhenInUseAuthorization;授权App仅限前台运行的时使用位置信息。
第二种植是requestAlwaysAuthorization.
授权App在前台要后台运行都可博得用户之职位信息,第二独授权都见面为app提供追踪用户位置的力。调用授权的法是:

locationManager.requestWhenInUseAuthorization()

locationManager.requestAlwaysAuthorization()

抱授权后,调用startUpdatingLocation()艺术被定位服务:

locationManager.startUpdatingLocation()

如此,locationManager会根据相关要求开始追踪并赶回用户位置信息。

Page 216 | Chapter 8 : Maps and Location

locationManager (_:, didUpdateLocations:)方法会提供CLLocation数组,按照出现前后顺序排列。数组中至少会有一个目标。数组中之各一个靶还是凡一个CLLocation。CLLocation这个仿佛为现实的位置整理组织CLLocationManager的职数据。CLLocation跟踪地理坐标,海拔,速度,方向,甚至包括定位准确度。CLLocation拥有多实用之习性:

coordinate
CLLocationCoordinate2D, 纬度坐标和经度坐标
altitude
海拔高度,单位:米
timestamp
获取到数量时之时空以及日期
description
据此字符串的格式返回CLLocation,可以用print()打印出

求记住,一旦您得到了公需要之音,必须休定位服务作用。为了停息这些劳动,在CLLocationManager中调用stopUpdatingLocation()
:

manager.stopUpdatingLocation()

选个例证,在locationManager( manager: ,didUpdateLocations:)术被得位置后,常常会告一段落定位服务。之前以CLLocationManager中开创的那些变量非常适合处理当下之这种景象。

**明白了!** iOS 8模拟器在模拟Core
Location时会见冒出有的上下未一致的表现。如果固定服务没有调用,在Info.plist文件中上加三只键:
NSLocationWhenInUsageDescription NSLocationAlwaysUsageDescription
NSLocationUsageDescription 每个键对应的值设置成Always或者When in Use
这三个键值会帮助打开定位服务

Core Location | Page 217

Map Kit

Map
Kit框架提供地图及样子,地图可以显得暨马路级别之信息,3D建筑,卫星图像,或者用双边结合起来。地图自动响应缩小、放大、平移、倾斜等手势动作,还能于地图上标注点同时添加注解。

MKMapView

Map
Kit提供MKMapView视图类来显示地图,MKMapView可以显得地图,管理用户的输入信息,展示起定义注释。

MKMapView也起一个delegate属性。和CLLocationManager的delegate属性一样,MKMapView的delegate也能接收updates。MKMapView
delegate需要按MKMapViewDelegate协议。设置delegate的方式是,从Storyboard的Editor中,将Map
View用Control拖动法拖动到Document Outline中的View
Controller文字上,然后弹出一个菜谱,点击菜单中的delegate,这样就算以系界面及设置好了delegate。

MKMapView有过多方便的性能和道。举了例子,MKMapView不用添加其它代码就可在地图及显示用户地理位置。我们管性能设置showsUserLocationtrue,就得以地形图及亮用户信息了:

myMapView.showsUserLocation = true

用户之职务将会当地图上用一个蓝点标注出来。

相似我们将用户所在位置设置也地图的着力点。如果想挪还安地图中心点,需要安装centerCoordinate属性,centerCoordinate特性需要CLLocationCoordinate2DCLLocationCoordinate2D是经度和纬度的坐标,被起包改成一个独的变量。通过CLLocationCoordinate2DMake方法创建CLLocationCoordinate2D

var coordinates: CLLocationCoordinate2D = CLLocationCoordinate2DMake(100,100)

偶尔我们会于地图上放位置,当region性设置好后,放大后图像会自行调整。region属性需要MKCoordinateRegion靶,然而,大部分景象下,比从创建新的对象,编辑时之region对象会再也简约有:

var updatedRegion: MKCoordinateRegion = myMapView.region
updatedRegion.span.longitudeDelta = updatedRegion.span.longitudeDelta * 2.0
updatedRegion.span.latitudeDelta = updatedRegion.span.latitudeDelta * 2.0 
myMapView.region = updatedRegion

Page 218 | Chapter 8 : Maps and Location

longitudeDeltalatitudeDelta且是span的一模一样局部,span是面积有多那个,以centerCoordinate为着力而兆示的肥瘦和可观。

Directions (方向)

Map Kit还会以App中提供建议计划路导航功能。MKDirections
API可以依据苹果服务器的计提供线路方向。有步行线路计划,驾驶线路计划,花费的日子,和另外可卜的门径。地图及之每个点用MKMapItem表示,MKMapItem包含了地图及有关地方的兼具信息,这些信包括地图位置,坐标值,地点名称等数。MKMapItem还能传回地图应用及,使用地图应用及再多高档功能。

开创MKMapItem最简便易行的方式是以mapItemForCurrentLocation主意,这个主意取得用户的位置然后因职务创建MKMapItem:

var mapItem: MKMapItem = MKMapItem.mapItemForCurrentLocation()

MKMapItem类有有造福之习性。name属性是一个字符串,提供地方的描述性名称。phoneNumber属性也是字符串,存储这个岗位的电话号码。URL属性存储位置的网址。

MKMapItem创建后,就可以轻松的将位置传递及地图应用及,使用导航功能。openMapWithItems: launchOptions法可收到一个屡组,数组中连总括同至多独的MKMapItem。通过launchOptions,这么来items就会吃射到地图应用达到。MKLaunchOptionsDirectionsModeKey吃地图应用基于两个点来供规划路。

Plotting Points (绘制点、标注点)

苹果店提供了一个于地形图上绘制点的措施,叫annotations(注解)。annotations是得定义一个地方要一个接触。它常用于突出感兴趣的地方,提供更多细节。annotations也有所一个而选标注气泡(optional
callout
bubble)。气泡代表有职亚洲必赢app在哪下载的名字和地点那样的音信。气泡也是不过点击的,可以像button(按钮)那样接收用户之动作。

annotations由简单有的组成,注解对象(annotation
object)和注释视图(annotation view)。annotation
object是一个轻量级对象,管理annotation中之多少。annotation
object是自MKPointAnnotation类中开创的。annotation
view是从MKPinAnnotationView类中创造的。annotation
view用来在地图上标注pin(大头针)。

Map Kit | Page 219

老三独步将annotation添加到MKMapView中。第一步是为感谢兴趣的地址创建一个MKPointAnnotation:

var point = MKPointAnnotation()
point.coordinate = CLLocationCoordinate2DMake(37.7756, -122.4193)
point.title = "San Francisco"

接下来,遵循MKMapView协议,回应mapView(_: viewForAnnotation:)艺术,此方法可以回收利用annotation
view,就像是table view中吗发生法子可以更使用cell:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!)-> MKAnnotationView! {
    var pin = MKPinAnnotationView(annotation: annotation, reuseIdentifier:"pinIdentifier")
    return pin
}

最后,调用addAnnotation主意,这样,就拿annotation添加到地图中了:

mapView.addAnnotation(point)

当今,我们来抓定你首先独使用了地图App吧。

Exercise: Adding Maps to the Passport App

演习请见之链接

Page 220| Chapter 8 : Maps and Location

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2018 亚洲必赢app官方下载 版权所有