2011-07-24 79 views
1

我所想要做的是創造的MKMapView自定義標註泡沫,只是因爲它是在http://blog.asolutions.com/2010/09/building-custom-map-annotation-callouts-part-1/解釋,但似乎有在原本很好地完成應用程序的一些錯誤。例如,當您將自定義標註氣泡打開並滾動時,在某個點上,地圖會滾動回打開的標註。縮放有時也會觸發此錯誤。有沒有人能夠解決這些問題?對不起創建一個新問題(因爲有一對夫婦正在處理自定義標註泡泡),但我沒有足夠的代表點來回答評論。定製標註泡沫的MKMapView

+0

該示例中是否存在應該關閉標註但不包含標註的代碼?也許你可以在這裏提供一個相關的摘錄,我們可以試着看看爲什麼它不起作用。 – progrmr

+0

我不認爲任何代碼以往任何時候都應該關閉它(模仿蘋果的行爲時),除非他們再次打開它時,它變得可見,也許你意思是? – xci

+0

這絕對是一個錯誤。我已經使用這段代碼一段時間了,但從來沒有碰到過這種情況。基本上,如果您滾動標註泡出來的視圖,然後點擊地圖,它認爲你正在利用註釋和未顯示的標註,所以它的重新調整屏幕,這樣的標註將被顯示。在這個工作一段時間。感謝您發現錯誤。 – Rayfleck

回答

-1

解決方法是在CalloutMapAnnotationView:didMoveToSuperview, 如果我們取消選擇註釋,則不要調用adjustMapRegionIfNeeded。

所以我修正它的方式是在我的mapViewController:didDeselectAnnotationView中,我從MapView中刪除了Annotation之前,將一個非零標記值賦給BasicMapAnnotationView。我選擇了159.

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { 

// distinguish between the map deselecting this and the user tapping on the callout. 
// in the former case, we want to deselect as normal; latter case, show coupon detail. 

if ([view isKindOfClass:[BasicMapAnnotationView class]]) { 
    if (((BasicMapAnnotationView *)view).calloutMapAnnotation) { 
     if (!((BasicMapAnnotationView *)view).preventSelectionChange) { 
      ((BasicMapAnnotationView *)view).tag = 159; // prevent adjusting map - see CalloutMapAnnotationView 
      [mapView removeAnnotation: ((BasicMapAnnotationView *)view).calloutMapAnnotation]; 
      // if we're deselecting the currently selected one, null out self.selectedAnnotationView 
      // Otherwise, the map view is deselecting this one in order to select another one 
      // and the timing is such that this nulling happens first, and the newly set AV would have no value for this. 
      if ((BasicMapAnnotationView *)view == self.selectedAnnotationView) { 
       self.selectedAnnotationView=nil; 
      } 
      ((BasicMapAnnotationView *)view).calloutMapAnnotation = nil; 
     } 
    } 
} 
} 

然後,在CalloutMapAnnotationView中,我檢查這個值,如果找到了,我不調整地圖。

- (void)didMoveToSuperview { 
if (self.parentAnnotationView) { 
    if (self.parentAnnotationView.superview) { 
     // null superview means it's been removed from map, and adjustMap gets wrong parentOrigin based on null superview, 
     // and recenters the map somewhere in Antarctica. The Ross Ice Shelf has no coupons except for frozen penguin eggs. 

     if (self.parentAnnotationView.tag != 159) {// Don't adjust map region on deselect. 
                //159 hardcoded in MapViewController:didDeselectAnnotationView 
      [self adjustMapRegionIfNeeded]; 
     } 
     [self animateIn]; 
    } 
} 
} 
+0

BasicMapAnnotationView沒有財產calloutMapAnnotation,並增加它不會有很大的裨益呢,因爲沒有值永遠是分配給它(除了零,雖然不能在瞬間到達)。也許我錯過了什麼? – xci

+0

你能提供整個代碼嗎?除非我完全錯過了某些東西,否則第1部分和第2部分都不會給出具有任何合理價值的calloutMapAnnotation。我想你給這樣的增加,但他們沒有工作,我想calloutMapAnnotation屬性是難辭其咎的。 – xci