3

MKMapView を使用するシンプルな iPhone アプリがあります。ズームする地域を調整するセグメント化されたコントロールがあります (通り、近所、都市、州、世界)。問題なく動作しますが、州レベルまでズームアウトして道路に戻ると、中心点がずれていることに気付きます。

以下は、領域の変更の前後に呼び出される 2 つのデリゲート メソッドと、セグメント化されたコントロールによって呼び出される私の changeZoom メソッドです。

- (void)mapView:(MKMapView *)mView regionDidChangeAnimated:(BOOL)animated
{
 MKCoordinateRegion 領域 = [mapView 領域];

 NSLog(@"リージョン DID が変更されました。中心は現在 %f,%f, Deltas=%f,%f",
    region.center.latitude、region.center.longitude、
    region.span.latitudeDelta、region.span.longitudeDelta);
}

- (void)mapView:(MKMapView *)mView regionWillChangeAnimated:(BOOL)animated
{
 MKCoordinateRegion 領域 = [mapView 領域];

 NSLog(@"Region WILL change. Center is now %f,%f, Deltas=%f,%f",
    region.center.latitude、region.center.longitude、
    region.span.latitudeDelta、region.span.longitudeDelta);
}


- (IBAction)changeZoom:(id)送信者
{
 UISegmentedControl *sc = (UISegmentedControl *)送信者;

 float mile_range = 1;

 NSLog(@"changeZoom が呼び出されました。現在の MapView は Center=%f,%f Deltas=%f,%f",
    mapView.region.center.latitude、mapView.region.center.longitude、
    mapView.region.span.latitudeDelta、mapView.region.span.longitudeDelta );

 スイッチ ( [sc selectedSegmentIndex] )
 {
  case 0: /* ストリート */
   mile_range=1;
   壊す;
  ケース 1: /* フード */
   mile_range=2;
   壊す;
  ケース 2: /* 都市 */
   mile_range=30;
   壊す;
  ケース 3: /* 状態 */
   mile_range=500;
   壊す;
  ケース 4: /* 世界 */
   mile_range=4000;
   壊す;
  デフォルト: /* エラー */
   NSLog(@"UISegmentedControl から選択された不明なセグメント!!!!!!!!!!!!!!");
   戻る;
   壊す;
 }

 originalZoomCenter = mapView.region.center;
 MKCoordinateRegion リージョン。
    region = MKCoordinateRegionMakeWithDistance( originalZoomCenter, mile_range/MILES_PER_METER, mile_range/MILES_PER_METER );
    region = [mapView regionThatFits: 地域];

 NSLog(@"Calling setRegion Center=%f,%f Deltas=%f,%f",
    region.center.latitude、region.center.longitude、
    region.span.latitudeDelta、region.span.longitudeDelta );

    [mapView setRegion: 地域アニメーション: はい];

 NSLog(@"After setRegion Center=%f,%f Deltas=%f,%f",
    mapView.region.center.latitude、mapView.region.center.longitude、
    mapView.region.span.latitudeDelta、mapView.region.span.longitudeDelta );
}

アプリを実行し、現在の場所のストリート ズーム レベルで開始し、クリックして州レベルにズームアウトし、ストリート レベルに戻ると、コンソールに次の出力が表示されます。

地域は変わります。センターは現在 30.145127、-40.078125、デルタ = 151.851332,225.000000
リージョン DID が変更されました。センターは現在 37.331676、-122.030725、デルタ = 0.024842、0.027466
changeZoom が呼び出されました。MapView は現在、Center=37.331676,-122.030725 Deltas=0.024842,0.027466 です。
呼び出し setRegion Center=37.331676,-122.030725 Deltas=12.708100,14.062500
地域は変わります。センターは現在 37.331676、-122.030725、デルタ = 0.024842、0.027466
setRegion 後 Center=37.331676,-122.030725 Deltas=0.024842,0.027466
リージョン DID が変更されました。センターは現在 37.335224、-122.036133、デルタ = 12.707505、14.062500
changeZoom が呼び出されました。MapView は現在、Center=37.335224,-122.036133 Deltas=12.707505,14.062500 です。
setRegion を呼び出す Center=37.335224,-122.036133 Deltas=0.024841,0.027466
地域は変わります。センターは現在 37.335224、-122.036133、デルタ = 12.707505、14.062500
setRegion Center=37.335224,-122.036133 Deltas=12.707505,14.062500 の後
リージョン DID が変更されました。中心は現在 37.335224、-122.036133、デルタ = 0.024841、0.027466

したがって、コードで行うすべての呼び出しは期待どおりに進み、中心は変化しませんが、MKMapViewDelegate メソッド regionDidChangeAnimated を監視すると、中心が移動することがわかります。そこにブレークポイントを設定すると、次のようなスタックが表示されます。

#0 0x00034c4c in -[MapViewController mapView:regionDidChangeAnimated:] MapViewController.m:209 で
#1 -[MKMapView _didChangeRegionMidstream:] の 0x01fbf7bf
#2 0x003e11f5 in -[UIView(Gestures) animator:stopAnimation:]
#3 0x003743be in -[UIAnimator stopAnimation:]
#4 0x00374154 in -[UIAnimator(Static) _advance:]
#5 HeartbeatTimerCallback の 0x0264d719
#6 CFRunLoopRunSpecific の 0x01d28ac0
#7 CFRunLoopRunInMode の 0x01d27c48
#8 GSEventRunModal の 0x0264a78d
#9 GSEventRun の 0x0264a852
#10 UIApplicationMain の 0x00307003
#11 0x00002194 メインの main.m:14

これは、センターが移動する理由を理解するのに本当に役立ちません。これをシミュレーターとデバイスの両方で実行しましたが、少し頭がおかしくなりました。

中心がずれている原因について誰かが何か洞察を持っているなら、私は何かの指針をいただければ幸いです.

4

1 に答える 1

3

私の経験から、regionマップのプロパティは、その領域がパブリック API または UI イベントを使用してプログラムで変更された後に再計算されます。

縮小すると、マップの中心の精度が低下します (1 ピクセルがより広い領域をカバーします)。次に、 で領域を設定した後setRegion:[animated:]、(このように計算された)map.regionは、setRegion で指定された領域とは異なる場合があります。これにより、得られるデルタを説明できます。

特定の問題を解決するために、ユーザーがマップを移動するたびにマップの中心を保存し、保存された値を使用して信頼する代わりにズームを実行したいと思いますmap.region.center

于 2012-01-17T01:08:09.887 に答える