指南针模式是什么
我自己起的名字,所谓指南针模式,就是MKMapView的MKUserTrackingModeFollowWithHeading模式,只不过MKMapView只能够让用户点自身进入Tracking模式
而且在打开Tracking模式的时候,Apple会十分体贴的帮你Zoom到用户点
导致有些需求无法规避这个动画。
1 | [mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:animate]; |
实现自定义指南针模式的方法
如果想要模仿FollowWithHeading有两个方法,并且各有优劣,但是无论使用何种方法,都是通过LocationManage获取到设备的Heading值,然后根据Heading值对MapView进行设置
方法 | 实现 | 优点 | 缺点 |
---|---|---|---|
Transform | 根据Heading值改变MapView的Transform | 简单,Overlay和Annotation始终保持TransformIdentity | 需要大于ScreenView的MapView,标志物不会自动调整方向 |
Camera | 根据Heading值改变MapView.Camera镜头状态 | Overlay和Annotation以及字体会自动调整方向 | Annotaiton如果需要保持Heading,需要更复杂的计算 |
Transform
通过设置地图的layer来达到Tracking旋转效果
1 | - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { |
需要配合函数 transformInTransformHeadingModeByDegrees 来计算旋转的Transform,由指南针追踪工具提供
Camera
通过设置地图的Camera来达到Tracking旋转效果
1 | - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { |
需要配合函数 cameraHeadingInCameraHeadingModeByDegrees 来计算旋转的Heading,由指南针追踪工具提供
公用预处理函数
1 | + (CLLocationDegrees)degreesRangeProcess:(CLLocationDegrees)degrees { |
指南针模式下Annotation锁定朝向
在不同的指南针模式下,我们始终想让某一个标志物锁定朝向,不会随着 设备的旋转导致的地图旋转而产生偏向 可以使用由指南针追踪工具提供的函数来设置Transform