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.trueHeadingCLHeading.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
magnetometergpsMapKit 中的地图显示方式
在 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, scrollEnabledregion: 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 提供的响应事件