2013-01-15 92 views
2

我試圖設置visibleMapRect MKMapView對象的屬性,但結果地圖矩形不是我所期望的。MKMapView的奇怪行爲visibleMapRect屬性

這是我的代碼:

NSLog(@"current size %f %f", mapView.visibleMapRect.size.width, mapView.visibleMapRect.size.height); 
NSLog(@"target size %f %f", newBounds.size.width, newBounds.size.height); 
mapView.visibleMapRect = newBounds; 
NSLog(@"new size %f %f", mapView.visibleMapRect.size.width, mapView.visibleMapRect.size.height); 

這是結果:

2013-01-15 19:21:25.440 MyApp[4216:14c03] current size 67108864.594672 46006272.643333 
2013-01-15 19:21:25.441 MyApp[4216:14c03] target size 3066685.527175 2102356.690531 
2013-01-15 19:21:25.442 MyApp[4216:14c03] new size 4194304.162631 2875392.126220 

什麼樣的魔力,這是?我怎樣才能將精確的可見矩形設置爲我的地圖視圖?

+2

請參閱http://stackoverflow.com/a/7419989/467105。即使這個問題涉及設置'region',它也適用於設置'visibleMapRect'。 – Anna

回答

1

感謝Anna Karenina的評論,我找到了答案。 MKMapView setVisibleMapRect方法顯示最大縮放級別的矩形,以適應輸入矩形,並顯示地圖瓷磚每像素像素以保持圖像看起來很清晰。

因此我編寫這段代碼來預測MKMapRect,它將顯示輸入MKMapRect。

- (MKMapRect)expectedMapRectForMapRect:(MKMapRect)mapRect inMapView:(MKMapView*)mapView 
{ 
    CGFloat targetPointPerPixelRatio = MAX(MKMapRectGetWidth(mapRect)/CGRectGetWidth(mapView.bounds), MKMapRectGetHeight(mapRect)/CGRectGetHeight(mapView.bounds)); 
    CGFloat expextedPointPerPixelRatio = powf(2, ceilf(log2f(targetPointPerPixelRatio))); 

    NSLog(@"expextedPointPerPixelRatio %f", expextedPointPerPixelRatio); 
    MKMapRect expectedMapRect; 
    expectedMapRect.size = MKMapSizeMake(CGRectGetWidth(mapView.bounds)*expextedPointPerPixelRatio, CGRectGetHeight(mapView.bounds)*expextedPointPerPixelRatio); 
    expectedMapRect.origin = MKMapPointMake(MKMapRectGetMidX(mapRect) - expectedMapRect.size.width/2, MKMapRectGetMidY(mapRect) - expectedMapRect.size.height/2); 

    expectedMapRect.origin.x = roundf(expectedMapRect.origin.x/expextedPointPerPixelRatio) * expextedPointPerPixelRatio; 
    expectedMapRect.origin.y = roundf(expectedMapRect.origin.y/expextedPointPerPixelRatio) * expextedPointPerPixelRatio; 
    return expectedMapRect; 
}