2010-01-22 22 views
2

我有一個簡單的iPhone應用程序,它使用MKMapView。它有一個分段控制,將調整區域以縮放(街道,鄰居,城市,州,世界)。它工作正常,但如果我縮小到州級並回到街道,我注意到中心點已經移動。iPhone:MKMapView縮小並返回導致地圖region.center漂移

以下是之前並得到由分段控制調用的區域變化和我changeZoom方法後得到叫了兩個委託方法:

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

NSLog(@"Region DID change. Center is now %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 region = [mapView region]; 

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)sender 
{ 
UISegmentedControl *sc = (UISegmentedControl *)sender; 

float mile_range = 1; 

NSLog(@"changeZoom called. MapView currently is Center=%f,%f Deltas=%f,%f", 
    mapView.region.center.latitude, mapView.region.center.longitude, 
    mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta); 

switch ([sc selectedSegmentIndex]) 
{ 
    case 0: /* Street */ 
    mile_range=1; 
    break; 
    case 1: /* Hood */ 
    mile_range=2; 
    break; 
    case 2: /* City */ 
    mile_range=30; 
    break; 
    case 3: /* State */ 
    mile_range=500; 
    break; 
    case 4: /* World */ 
    mile_range=4000; 
    break; 
    default: /* Error */ 
    NSLog(@"Unknown segment selected from the UISegmentedControl!!!!!!!!!!!!!!"); 
    return; 
    break; 
} 

originalZoomCenter = mapView.region.center; 
MKCoordinateRegion region; 
    region = MKCoordinateRegionMakeWithDistance(originalZoomCenter, mile_range/MILES_PER_METER, mile_range/MILES_PER_METER); 
    region = [mapView regionThatFits: region]; 

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

    [mapView setRegion: region animated: YES]; 

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

如果我運行的應用程序,它在街上變焦開出在我的當前位置的水平,然後我點擊縮小以國家級和回街道,我得到了在控制檯下面的輸出:

 
Region WILL change. Center is now 30.145127,-40.078125, Deltas=151.851332,225.000000 
Region DID change. Center is now 37.331676,-122.030725, Deltas=0.024842,0.027466 
changeZoom called. MapView currently is Center=37.331676,-122.030725 Deltas=0.024842,0.027466 
Calling setRegion Center=37.331676,-122.030725 Deltas=12.708100,14.062500 
Region WILL change. Center is now 37.331676,-122.030725, Deltas=0.024842,0.027466 
After setRegion Center=37.331676,-122.030725 Deltas=0.024842,0.027466 
Region DID change. Center is now 37.335224,-122.036133, Deltas=12.707505,14.062500 
changeZoom called. MapView currently is Center=37.335224,-122.036133 Deltas=12.707505,14.062500 
Calling setRegion Center=37.335224,-122.036133 Deltas=0.024841,0.027466 
Region WILL change. Center is now 37.335224,-122.036133, Deltas=12.707505,14.062500 
After setRegion Center=37.335224,-122.036133 Deltas=12.707505,14.062500 
Region DID change. Center is now 37.335224,-122.036133, Deltas=0.024841,0.027466 

因此,所有的電話我讓我的代碼進行預期和該中心不會改變,但當我監視MKMapViewDelegate方法regionDidChangeAnimated時,我看到中心被移動了。如果我設置一個斷點,我看到一個堆棧看起來像這樣:

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

這並不能真正幫助我理解爲什麼中央會移動。我已經在模擬器和設備上運行了它,這讓我有點瘋狂。

如果任何人有任何洞察力是什麼導致中心轉移,我將不勝感激任何指針。

+1

的錯誤,我看到,當我從1英里增量放大到: 市(30英里)的錯誤是0.12英里(0.4%) 州(500英里)的錯誤是0.78英里(0.156%) 世界( 1000英里)誤差爲3.17英里(0.317%) 因此,當我縮小到這些長/緯度增量並返回時,中心漂移了百分之幾的百分比。我想知道這是否可以作爲浮點截斷可能發生在MKMapView類內部? – Pat

回答

3

根據我的經驗,地圖的region屬性在用公共API或使用UI事件以編程方式修改後重新計算。

通過縮小,可以減少地圖中心的精度(一個像素覆蓋更大的區域)。然後,在用setRegion:[animated:]設置區域之後,(因此計算的)map.region可以不同於在setRegion中給出的區域。這可以解釋你得到的三角洲。

爲了解決您的特定問題,我寧願在用戶每次移動地圖時存儲地圖的中心,並使用存儲的值進行縮放,而不是相信map.region.center