1

我正在拼命寻找一种解决方法来解决 iOS6 中 MapKit 中记录良好的错误,这使得 MKUserTrackingModeFollowWithHeading 在更高的放大倍率下实际上无法使用:

[这里]有一个非常简单的示例项目。(https://dl.dropboxusercontent.com/u/316978/MapKitBug.zip

重现步骤:

  1. 点击 MKUserTrackingModeButton 以放大您的位置。
  2. 点击放大 2 或 3 倍。
  3. 点击 MKUserTrackingModeButton 以选择 MKUserTrackingModeFollowWithHeading

问题:

此模式不会“粘住”,几乎总是在几秒钟后退出 (1-20)。蓝色的“您的位置”注释“振动”并且在 MKUserTrackingModeFollowWithHeading 中时似乎从其中心位置略微移动。

请注意,当您放大时,这会成为一个越来越大的问题。在默认放大倍率下(当您第一次点击 MKUserTrackingModeButton 按钮时,这不是什么大问题。

一个明显的解决方法是限制缩放级别,但不幸的是我需要完全放大我的应用程序。

4

2 回答 2

1

打开了 TSI,Apple 确认没有解决方法。我想知道他们是否会在 7 内修复它……</p>

于 2013-08-22T07:15:40.477 回答
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];

        }

    }

这实际上让我非常接近,但它不够可靠,就像我说的,我不得不考虑在我的最后期限内优先考虑其他功能,所以这就是我最终要做的:

  1. 首先,我在 MKMapKit 上获取了缩放类别的代码:http: //troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/

  2. 接下来,我在该博客的评论中包含了访问者提供的这个方法:

    - (int) getZoomLevel {
    
       return 21 – round(log2(mapView.region.span.longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * mapView.bounds.size.width)));
    
    }
    
  3. 最后,在测试缩放级别与错误发生的情况下进行了一些试验和错误,导致我找到了以下“解决方法”:

    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];
    
    }
    
于 2013-08-23T23:26:24.603 回答