2013-08-06 12 views
0

我有一個使用MapKit的應用程序。
我在調整地圖大小後計算當前的縮放比例。
通過(從MKGeometry.h文件)調整MKMapView的縮放比例在繪製MKOverlay時不等於zoomScale

MKZoomScale provides a conversion factor between MKMapPoints and screen points. 
When MKZoomScale = 1, 1 screen point = 1 MKMapPoint. When MKZoomScale is 
0.5, 1 screen point = 2 MKMapPoints. 

所以定義,我想這在這樣:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    CGSize screenSize = mapView.bounds.size; 
    MKMapRect mapRect = mapView.visibleMapRect; 
    MKZoomScale zoomScale = screenSize.width * screenSize.height/(mapRect.size.width * mapRect.size.height); 
} 

計算的zoomScale符合定義(我檢查)。

我也得出一個覆蓋在我的MapView的方法

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context 

的問題是,我的計算zoomScale不等於一體,是傳遞給此方法的系統。我期望它們是平等的,因爲drawMapRect:只是在調整大小後調用(實際上,調整大小會導致調用此方法)。

這裏有什麼問題?

我還試圖用

currentZoomScale = mapView.bounds.size.width/mapView.visibleMapRect.size.width; 

,建議here,但這currentZoomScale不等於傳遞給drawMapRect:爲好。

+0

我遇到了與您同樣的問題,而且我還沒有尚未找到解決方案... –

+0

我也沒有:( – Anastasia

回答

3

的同事,而我卻發現一些古怪今天這或許可以解釋這種現象:這是傳遞到drawMapRect:方法MKZoomScale總是反映了在該MKMapView繪製的地圖圖塊的當前縮放級別。

例如,如果您操控地圖將在精確縮放級別7,它繪製地圖圖塊的縮放級別7,因此,在MKOverlaydrawMapRect:縮放比例爲1/(2^(20-level)) = ~0.000122。現在,如果進一步放大,但不是地圖必須使用8級圖塊,則可以預期當再次調用drawMapRect:時,縮放比例會增加。但是,縮放比例保持不變。

爲什麼會出現這種情況的一種行爲如下:在drawMapRect:中放置一個斷點並放大一點 - 再次,不足以使用一組新的拼貼塊。你會注意到drawMapRect:實際上並沒有被調用!事實上,只有兩個辦法得到它被稱爲:

  1. 泛在地圖上,直到一組新的瓦片已被繪製
  2. 放大或縮小,直至達到閾值,其中新瓷磚級別必須呈現

回想起來,這非常合理。核心圖形高度優化,並希望儘可能少的繪圖。當用戶稍微放大或縮小圖像時,它最有可能使用疊加圖塊的緩存圖像,並恰當地向上或向下縮放圖像。

我們可以合理地假設,即使MKMapView可能具有0和1之間的任何小數的縮放比例,MKOverlay只在縮放比例達到需要重繪的閾值時纔會繪製,即在整數縮放級別從1-20,即在縮放比例1,1/2,1/4,1/8,1/16 ...

相關問題