2011-11-10 51 views
2


我有一個帶有一些註釋的MKMapView。現在,每當區域發生變化時,我都會加載新的註釋。這可以正常工作,但是如果某些註記位於地圖視圖的邊界附近並點擊它,註釋信息窗口會彈出並且mkmapview區域會稍微移動一點(以便它可以很好地顯示窗口),但問題是還調用了regionDidChangeAnimated,它重新加載了所有的註釋,當然隱藏了信息窗口。
我知道您可以在重新加載時再次點擊註釋,但對於用戶而言,它似乎已損壞,並且當您不需要時也可以重新加載註釋。
有什麼辦法來檢查regionDidChangeAnimated是因用戶操作還是以編程方式調用?
謝謝。MKMapView regionDidChangeAnimated由用戶操作或程序調用

回答

5

當鄰近地圖視圖邊緣的註釋被分接,並將其移動地圖,以適應標註,事件的序列是:

  1. regionWillChangeAnimated稱爲
  2. didSelectAnnotationView稱爲
  3. regionDidChangeAnimated

使用兩個BOOL ivar標誌,您可以觀察此序列並防止在0123中重新加載註釋。

例如:

-(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    regionWillChangeAnimatedCalled = YES; 
    regionChangedBecauseAnnotationSelected = NO; 
} 

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    regionChangedBecauseAnnotationSelected = regionWillChangeAnimatedCalled; 
} 

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    if (!regionChangedBecauseAnnotationSelected) //note "!" in front 
    { 
     //reload (add/remove) annotations here... 
    } 

    //reset flags... 
    regionWillChangeAnimatedCalled = NO; 
    regionChangedBecauseAnnotationSelected = NO; 
} 
+0

好主意,我沒有想到檢查didSelectAnnotationView方法,我會試試看,謝謝! :) – haluzak

1

您刪除所有註釋並在regionDidChangeAnimated方法中添加新註釋?我認爲更強大的解決方案是跟蹤使用字典和某個唯一標識符作爲關鍵字(不會更改,數據庫ID等)添加到映射中的所有註釋。然後,在您的regionDidChangeAnimated方法中,您只能添加實際上新的,也可能刪除區域外的註釋。

0

您可能會發現這是一個更好的體驗,以配合載入你的新註釋到UIGestureRecognizer,所以你只加載新的,當你知道一個事實,即用戶擁有手動滾動地圖。這也可以防止設備旋轉時重新加載。請參閱Jano在determine if MKMapView was dragged/moved的回答。

相關問題