1.新建一个SingleView Application。
2.导入地图框架#import
3.新建一个类RunningViewController,继承自UIViewController,遵守MAMapViewDelegate,该类用来专门展示跑步过程中的地图界面,同时创建RunningViewController.xib文件。
class RunningViewController: UIViewController, MAMapViewDelegate
4.实例化地图和定位相关属性,将一个UIView拖到RunningViewController.xib的视图上,设置四边具体父视图的间距为0,并链接上mapView。
@IBOutlet weak var mapView: MAMapView!
var coordinateArray: [CLLocationCoordinate2D] = []
5.coordinateArray数组用来存储每次获取的定位更新数据,绘制路径时需要用到。
在viewDidLoad的时候进行地图初始化的设置
override func viewDidLoad() {
super.viewDidLoad()
initMapView()
}
func initMapView()
{
mapView.delegate = self
mapView.zoomLevel = 15.5
mapView.distanceFilter = 3.0
mapView.desiredAccuracy = kCLLocationAccuracyBestForNavigation
}
6.将视图控制器设置为mapView的代理,当位置变化更新时通过代理进行回调,绘制路径时也需要通过代理进行属性的设置
zoomLevel为当前地图缩放的比例
distanceFilter为定位的最小更新距离,当移动距离超过设定的值时便会有位置的更新回调
desiredAccuracy为定位精度,默认为最高精度,一般直接用这个就好
当视图显示后,开始进行定位。
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
startLocation()
}
func startLocation()
{
mapView.showsUserLocation = true
mapView.userTrackingMode = MAUserTrackingMode.Follow
mapView.pausesLocationUpdatesAutomatically = false
mapView.allowsBackgroundLocationUpdates = true
}
showsUserLocation设为true后便开始进行定位,设为false则定位停止。定位本身会比较耗点,应用在不需要定位时记得将定位功能关闭,否则你的手机电量会消耗很快滴。
userTrackingMode为定位的方式,查看接口可知有三种形式,这里采用跟随用户位置移动的定位方式
allowsBackgroundLocationUpdates设置为true表示允许进行后台定位,保证之前有设置过App registers for location updates属性,否则会崩溃。
7.代理的实现
每次有位置更新变会调用mapView(mapView: MAMapView, didUpdateUserLocation userLocation: MAUserLocation, updatingLocation: Bool)函数。
// MARK: MAMapViewDelegate
func mapView(mapView: MAMapView, didUpdateUserLocation userLocation: MAUserLocation, updatingLocation: Bool)
{
// 地图每次有位置更新时的回调
if updatingLocation {
// 获取新的定位数据
let coordinate = userLocation.coordinate
// 添加到保存定位点的数组
self.coordinateArray.append(coordinate)
updatePath()
}
}
通过updatePath函数进行路径的绘制
func updatePath () {
// 每次获取到新的定位点重新绘制路径
// 移除掉除之前的overlay
let overlays = self.mapView.overlays
self.mapView.removeOverlays(overlays)
let polyline = MAPolyline(coordinates: &self.coordinateArray, count: UInt(self.coordinateArray.count))
self.mapView.addOverlay(polyline)
// 将最新的点定位到界面正中间显示
let lastCoord = self.coordinateArray[self.coordinateArray.count - 1]
self.mapView.setCenterCoordinate(lastCoord, animated: true)
}
removeOverlays用来移除掉之前的路径。
addOverlay添加重新绘制的路径。
setCenterCoordinate将指定的坐标点显示在地图中间,保证在用户跑了很长的距离之后也不会超出地图的显示范围。