我正在拼命寻找iOS6中MapKit中记录良好的错误的解决方法,这使得MKUserTrackingModeFollowWithHeading在更高的放大率下无法使用:
有一个非常简单的示例项目[这里]。(https://dl.dropboxusercontent.com/u/316978/MapKitBug.zip)
重现的步骤:
的问题:
此模式不会“粘住”,几乎总是在几秒钟后退出(1-20)。 蓝色'你的位置'注释'振动'并且似乎从它的中心位置稍微移动,而它在MKUserTrackingModeFollowWithHeading中。
请注意,在放大时这会成为一个越来越大的问题。在默认放大倍率(首次点击MKUserTrackingModeButton按钮时,您可以使用它,这不是一个问题。
一个明显的解决方法是限制缩放级别,但不幸的是我需要完全放大我的应用程序。
答案 0 :(得分:1)
开设TSI,Apple确认没有解决方法。我想知道他们是否已经修好了7 ...
答案 1 :(得分:1)
我也对这个非常讨厌的错误感到沮丧。
我的最后期限即将到来,因此我无法花费大量时间来尝试实施变通方法。
我设法让它在最大缩放时保持MKUserTrackingModeFollowWithHeading,但是用户位置注释“pin”仍然非常沉重地抖动,在某些边缘情况下,它仍然取消回MKUserTrackingModeFollow。
我最初做的是使用regionDidChangeAnimated:委托方法中的BOOL标志强制进行更正,如下所示:
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated {
NSLog(@"regionWillChangeAnimated:");
}
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
NSLog(@"regionDidChangeAnimated:");
[self forceCorrectUserTrackingMode];
}
- (void)forceCorrectUserTrackingMode {
if (shouldFollowWithHeading == YES && ([mapView userTrackingMode] != MKUserTrackingModeFollowWithHeading) ) {
NSLog(@"FORCE shouldFollowWithHeading! - setUserTrackingMode:MKUserTrackingModeFollowWithHeading");
[self.mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES];
} else if (shouldFollowWithHeading == NO && ([mapView userTrackingMode] != MKUserTrackingModeNone) ) {
NSLog(@"FORCE should NOT FollowWithHeading - setUserTrackingMode:MKUserTrackingModeNone");
[self.mapView setUserTrackingMode:MKUserTrackingModeNone animated:YES];
}
}
这实际上让我非常接近,但它不够可靠,就像我说的那样,我不得不考虑在截止日期前优先考虑其他功能,所以这就是我最终做的事情:
首先,我在MKMapKit上为缩放类别抓取了这段代码:http://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/
接下来,我添加了访问者在该博客评论中提供的此方法:
- (int) getZoomLevel {
return 21 – round(log2(mapView.region.span.longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * mapView.bounds.size.width)));
}
最后,测试缩放级别与错误发生的一些试验和错误导致我进入以下“解决方法”:
CLLocationCoordinate2D userLocation_CenterCoordinate = CLLocationCoordinate2DMake([locationManager location].coordinate.latitude, [locationManager location].coordinate.longitude);
int currentZoomLevel = [MKMapView getZoomLevelForMapView:mapView];
int newZoomLevel = 17;
if (currentZoomLevel > 17) {
NSLog(@"Adjusting mapView's zoomLevel from [%d] to [%d], also centering on user's location", currentZoomLevel, newZoomLevel);
[mapView setCenterCoordinate:userLocation_CenterCoordinate zoomLevel:newZoomLevel animated:NO];
} else {
NSLog(@"Centering on user's location, not adjusting zoom.");
[mapView setCenterCoordinate:userLocation_CenterCoordinate animated:NO];
}