MKMapkit的MKUserTrackingModeFollowWithHeading和setCamera同时使用的时候 会有个隐形的bug...
想写一个开源的Ingress,这里面就有个需求,地图上要保证倾斜角 保证高度,而默认的Camera是没有倾斜角度的,需要加一个新的setCamera
一开始设置了
self.HackMapView.userTrackingMode = MKUserTrackingModeFollowWithHeading
毕竟追踪定位是肯定的啊...然后就是
if ([mapView respondsToSelector:@selector(camera)]) {
[mapView setShowsBuildings:YES];
MKMapCamera *newCamera = [[mapView camera] copy];
//倾斜角
[newCamera setPitch:70.0];
//高度
[newCamera setAltitude:100.0];
[mapView setCamera:newCamera animated:YES];
}
这个时候执行代码就会发现:
MKUserTrackingModeFollowWithHeading
总是慢于setCamera
的 而且优先级好像也高些(...虽然这么说有点不专业)
也就是说: setCamera
会先执行 于是屏幕上Camera先降低高度 调整倾斜角度
结果一到两秒后MKUserTrackingModeFollowWithHeading
一执行 整个地图移动到我的位置 这个时候之前setCamera
的参数就跟着MKUserTrackingModeFollowWithHeading
全部复位了
角度和高度全没了...
全没了...
没了...
了...
...
更甚 因为有设置
[mapView setCamera:newCamera animated:YES];
有时候在setCamera
的animated没有执行完的时候 ,MapKit的协议
- (void)mapViewWillStartLocatingUser:(MKMapView *)mapView{ }
就已经开始执行了,而地图拿到我的位置也会进行一个动画移动到我的位置上 这个时候:
setCamera
动画的目标是默认地图的位置(MKCoordinateRegion
,一般是大西洋某个不知道在哪的海里面...)
MKUserTrackingModeFollowWithHeading
动画的目标是我现在的位置
这两个动画同时执行 结果就是地图到最后显示的什么也不是 介于MKCoordinateRegion
和我当前定位位置的中间位置....
_ (:з」∠) _
好吧...其实说起来 也不算是bug 但是按照我的理解 苹果应该做好这部分的逻辑判断的...否则我硬要使用setCamera
的话 简直要把整个MKUserTrackingModeFollowWithHeading
用
+ (instancetype _Nonnull)cameraLookingAtCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
fromEyeCoordinate:(CLLocationCoordinate2D)eyeCoordinate
eyeAltitude:(CLLocationDistance)eyeAltitude
自己重写一遍...而且肯定没有苹果自己写的好
丢几个类似的问题:
1.stackoverflow
I believe this is a bug in MapKit. I made similar observations with programmatic zooming while MKUserTrackingModeFollowWithHeading is enabled: The map shortly zooms out but returns to the previous zoom level as soon as it receives the next location update.
MapKit: programmatic zooming during UserTracking
MKUserTrackingModeFollow prohibits annotation selection at the edge
EDIT:2015-9-3 12:28
写了一个ticket给bugreport
SEE:
http://openradar.appspot.com/22539174