iOS6中MKUserTrackingModeFollowWithHeading Bug的任何解决方法?

时间:2013-07-18 08:54:18

标签: ios cocoa-touch mapkit mkusertrackingmode

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

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

重现的步骤:

  1. 点按MKUserTrackingModeButton以放大您的位置。
  2. 点按可放大2或3倍。
  3. 点按MKUserTrackingModeButton以选择MKUserTrackingModeFollowWithHeading
  4. 的问题:

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

    请注意,在放大时这会成为一个越来越大的问题。在默认放大倍率(首次点击MKUserTrackingModeButton按钮时,您可以使用它,这不是一个问题。

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

2 个答案:

答案 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];

        }

    }

这实际上让我非常接近,但它不够可靠,就像我说的那样,我不得不考虑在截止日期前优先考虑其他功能,所以这就是我最终做的事情:

  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];
    
    }