1

MKUserTrackingModeFollowWithHeading を高倍率で事実上使用できなくする、iOS6 の MapKit の十分に文書化されたバグの回避策を必死に探しています。

非常に単純なサンプル プロジェクトがあります [こちら]。( https://dl.dropboxusercontent.com/u/316978/MapKitBug.zip )

再現する手順:

  1. MKUserTrackingModeButton をタップして、現在地にズームインします。
  2. タップして 2 ~ 3 倍に拡大します。
  3. MKUserTrackingModeButton をタップして MKUserTrackingModeFollowWithHeading を選択します

問題:

このモードは「固執」せず、ほとんどの場合、数秒 (1 ~ 20) 後に終了します。青い「現在地」注釈が「振動」し、MKUserTrackingModeFollowWithHeading にある間、中央の位置からわずかに移動しているように見えます。

これは、ズームインするにつれてますます問題になることに注意してください。デフォルトの倍率 (MKUserTrackingModeButton ボタンを最初にタップしたときに表示される倍率) では、それほど問題にはなりません。

明らかな回避策はズーム レベルを制限することですが、残念ながらアプリケーションでフル ズームが必要です。

4

2 に答える 2

1

私も、この非常に厄介なバグにイライラしました。

締め切りが迫っているので、回避策の実装に多くの時間を費やすことはできません。

最大ズームで MKUserTrackingModeFollowWithHeading にとどまることができましたが、ユーザーの場所の注釈「ピン」はまだかなり大きく揺れており、いくつかのエッジケースでは、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 に答える