Location and Maps Programming Guide 文档阅读过程中的 demo, 只对可能常用的一些属性和方法进行了尝试
有两种服务可以获取到用户的当前位置
举例如何选择获取位置信息服务?
UIBackgroundModes
键值来后台运行 App 和获取位置信息更新信息
location manager
的 pausesLocationUpdatesAutomatically
属性为 YES
, 节省电量significant-change location
, 但使用这项服务需要注意,因为这会持续监听位置,直到人为停止位置信息服务不可用的情况
获知地理位置信息是否可用
[CLLocationManager locationServicesEnabled];
配置项
CLLocationManager
实例,配置 desiredAccuracy
和 distanceFilter
属性startUpdatingLocation()
方法location manager
将会通知代理对象stopUpdatingLocation()
方法使用 significant-change-location, 需要获取 kCLAuthorizationStatusAuthorizedAlways
权限
CLLocationManager
实例startMonitoringSignificantLocationChanges()
方法CLLocationManager
实例中获取位置信息,但这只会获取最近的数据,即,如果位置变化不是很大,那位置数据可能会一样UIApplication
的 beginBackgroundTaskWithName:expirationHandler:
方法launchOptions
将会传递到 application:willFinishLaunchingWithOptions:
或 application:didFinishLaunchingWithOptions:
方法,位置信息位于 UIApplicationLaunchOptionsLocationKey
键值中Core Location 支持两种方式来获取方向信息
heading 指的是设备真正的指向,即 真•北 或者 磁场的北 course 指的是设备的运动方向,并不考虑设备的地理指向
heading 值可以是 地磁场的北 或者 地图意义上的北(真•北)
设备附近的磁场可能会受到能散发的其他设备影响,如音响,但 Core Location 能够过滤掉干扰
CLLocationManager
实例headingAvailable
类方法CLLocationManager
实例分配委托对象startUpdatingHeading
方法,开始传递 heading 事件course 事件包含的是设备的 运动方向 与 运动速度,从
CLLocation
实例中可以获取
几个蜜汁属性
CLHeading.trueHeading
CLHeading.magneticHeading
0
表示设备的指向与指向北的直线重合0
, 表示无法判断CLHeading.headingOrientation
CLHeading.headingAccuracy
Info.plist
文件中,写入 UIRequiredDeviceCapabilities
字段Info.plist
中包含了该字段,App Store 将会阻止不能正常使用该功能的设备下载该 AppUIRequiredDeviceCapabilities
是一个字符串数组,可以填写一下预定义的值
location-services
App 需要位置信息服务才能正常使用gps
App 需要 GPS 提供的精确定位才能正常使用若 App 在没有位置信息服务也能正常使用,就千万不要添加
UIRequiredDeviceCapabilities
对应的值了
使用地理位置信息涉及隐私,涉及的描述字段有
NSLocationWhenInUseUsageDescription
: StringNSLocationAlwaysUsageDescription
: String使用设备方向指向信息,涉及的描述字段有
UIRequiredDeviceCapabilities
: Array
magnetometer
gps
MapKit 中的地图显示方式
在 MapKit 上的地图,可以通过代码
MapKit 自身提供放大与拖动的触摸事件
对地图的使用方式不同,用于描述的数据点也不同
CLLocationCoordinate2D
结构体来定义 map coordinateMKCoordinateSpan
和 MKCoordinateRegion
结构体来定义区域信息MKMapPoint
结构体定义一个 map pointMKMapSize
和 MKMapRect
结构体定义区域CGPoint
结构体来定义一个 pointCGSize
和 CGRect
结构体来定义一个区域大多数情况下,使用的 point 类型都会由 MapKit 的接口决定,一般都是 map coordinate 当我们存储数据时,map coordinate 会更准确,可以移植性更强
from | to | rouines |
---|---|---|
Map coordinates | Points | convertCoordinate:toPointToView: (MKMapView) convertRegion:toRectToView: (MKMapView) |
Map coordinates | Map points | MKMapPointForCoordinate |
Map points | Map coordinates | MKCoordinateForMapPoint MKCoordinateRegionForMapRect |
Map points | Points | pointForMapPoint: (MKOverlayRenderer) rectForMapRect: (MKOverlayRenderer) |
Points | Map coordinates | convertPoint:toCoordinateFromView: (MKMapView) convertRect:toRegionFromView: (MKMapView) |
Points | Map points | mapPointForPoint: (MKOverlayRenderer) mapRectForRect: (MKOverlayRenderer) |
MKMapView
类本身提供了 显示地图数据 ,处理交互手势 ,管理自定义视图 的功能MKMapView
, 而是将其继承在视图层次结构中,构成 as-is 的关系Never subclass
MKMapView
, 需要持保留态度,UIAlertController
在文档中也曾经说过不要 subclass, 但实践发现,subclassAlertController
可以创建出一个更加灵活的选择菜单
MKMapView
可以像对待其他 UIView
一样对待它MKMapView
的 view, 会保持着定义它们的 frame
值,并且不会跟随着 MKMapView
一起滚动,就是固定着。如果需要让 subview 跟随 MKMapView
一起滚动,就必须使用 annotation 或者 overlayMKMapView
的视图层级结构进行修改MKMapView
对象只可以接收用户交互动作和显示地图数据MKMapView
对象使用的是 3D 角度显示地图,pitch 手势可用,还有一个现时的方向指示MKMapCamera
对象来定制 pitch 手势和旋转mapType
来配置地图的显示模式(3D, 卫星地图,3D + 卫星地图)rotateEnabled
, pitchEnabled
, zoomEnabled
, scrollEnabled
region: MKCoordinateRegion
region
重新赋值来改变可视部分MKCoordinateRegion
分析
typedef struct {
CLLocationCoordinate2D center; // 区域中心点
MKCoordinateSpan span;
} MKCoordinateRegion;
着重分析 span
span
值,可以通过 MKCoordinateRegionMakeWithDistance
来生成 MKCoordinateRegion
数据region
属性进行赋值,或使用 setRegion:animated:
方法设置 region
值时,最后的结果,region
存储的值可能与之前的设定值不同region
值时,可能会隐含设定了放大的倍数MKMapView
并不能随意放大或缩小地图的显示范围,只支持特定的倍数,因此,region
可能会对新值进行调整MKMapview
的 regionThatFits:
方法来获取新的 region
值调整之后的值3D 地图是一个鸟瞰形式的 2D 地图
MKMapCamera
对象使用以下属性来定义 3D 地图的样貌
具体的操作看对应的代码
同时,MKMapCamera
的信息支持持久化存储
MKMapCamera *camera = [map camera]; // Get the map's current camera.
[NSKeyedArchiver archiveRootObject:camera toFile:stateFile]; // Archive the camera.
…
MKMapCamera *camera = [NSKeyedUnarchiver unarchiveObjectWithFile:stateFile]; // Unarchive the camera.
[map setCamera:camera]; // Restore the map.
放大和移动地图
centerCoordinate
属性,可以调用
setCenterCoordinate:animated:
setCamera:animated:
region
属性,可以调用
setRegion:animated:
改变
region
值的时候,会触发MKMapView
重新计算缩放倍数并设定显示的内容,所以,如果只想移动地图,则只改变coordinate
的值
MKMapView
内置支持显示用户当前的位置,设置 showUserLocation
属性为 true
, 默认是 false
MKMapView
使用 Core Location 去寻找设备的位置,并添加 MKUserLocation
类型的 annotation 到地图mapView:viewForAnnotation:
委托方法来返回一个 view 用作 annotationMKMapSnapshotter
的对象来异步创建一个静态的地图图片,快照的结果包含了一个 UIImageView
对于地图的截图,推荐使用
MKMapSnapshotter
的对象来完成
MKMapSnapshotOptions
对象,它会配置地图的样貌及输出的大小,iOS 的 App 同时可以配置缩放的倍数MKMapSnapshotter
对象,并使用上面的 option 对象进行初始化startWithCompletionHandler:
来开始异步的截图任务打印地图
直接看文档了
MKMapView
的 MKMapViewDelegate
提供的响应事件