2012-11-12 41 views
5

我有一個帶有自定義註釋的iOS應用程序。點擊一個MKAnnotationView來取消選擇它並隱藏它的標註

  1. 我希望能夠挖掘一個MKAnnotationView一次,以顯示它的標註(正常工作)
  2. ,然後我想挖掘MKAnnotationView第二次取消選擇註釋和隱藏的標註註釋(適用於iOS5,但不適用於iOS6)。

據我所知,didSelectAnnotationView只應該被調用的初始選擇的註釋。 ([1]:Selecting a MapView Annotation Twice ),並基於本文和我已閱讀過的其他文章[[2]:ios mapkit closing annotation callouts by tapping the map),它看起來像在檢測到MKAnnotationView被選中後需要使用UITapGestureRecognizer。

所以,我使用的是UITapGestureRecognizer,當我已經選擇了我的註釋視圖時,我正確地檢測到額外的水龍頭,並且當我識別出水龍頭並且我正在隱藏/取消選擇時調用deselectAnnotation標註/註釋分別。它在iOS5中效果很好,但它在iOS6中只有一半可用

在iOS6中,輕敲手勢識別器被調用,並且我調用我的代碼來隱藏標註並取消選擇註釋,一切正常,但接下來使用selectAnnotationView方法會以某種方式被調用,所以我的標註再次出現,我的標註再次被選中。

我假設發生的事情是,當我在抽頭手勢識別器中取消選擇註釋視圖後,輕擊事件仍處於活動狀態,mapView檢測到觸摸事件並調用selectAnnotationView,因此註釋我只是被取消選擇現在再次被選中。

我不知道爲什麼它只發生在iOS6,但我希望輸入任何其他想法來處理我想要的行爲。

+0

可以顯示代碼中刪除手勢? – james075

回答

0

我不知道你是否仍然有問題(我希望不會因爲你的帖子有點舊)。 但是,如果有人遇到同樣的問題,取消選擇註釋並避免mapkit重新選擇它的一種解決方案是在取消選擇註釋之前添加一點延遲。

- (void)annotationTap:(UIGestureRecognizer *)gesture 
{ 
    MKAnnotationView *mkav = (MKAnnotationView *)gesture.view; 
    //Add a small delay to deselect 
    [self performSelector:@selector(deselectAnnotation:) withObject:mkav.annotation afterDelay:0.3]; 
    [gesture.view removeGestureRecognizer:gesture]; 
} 


- (void)deselectAnnotation:(id<MKAnnotation>)annotation 
{ 
    [self.mapView deselectAnnotation:annotation animated:YES]; 
} 

而如果用戶取消在地圖上自來水donMt註釋建立與此代碼

- (void) mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { 
     for (UIGestureRecognizer *recognizer in view.gestureRecognizers) { 
      [view removeGestureRecognizer:recognizer]; 
     } 
}