2013-05-18 79 views
3

我正在根據用戶添加的註釋的位置創建一個路徑(MKPolyline)。我想讓用戶通過拖動管腳來改變路徑。我目前可以做到這一點,但MKPolyline不會更新,直到引腳被丟棄。在拖動時獲取MKAnnotation的座標

我實現- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldStateMKAnnotationViewDragStateDragging,但它只是警告我,用戶拖動了引腳,並沒有通知有關新位置。

如何獲得當前位置的註釋爲dragg,每次改變時?我希望得到有關位置的任何變化的通知,同時拖動可以更新MKPolyline以便在引腳移動時跟隨引腳,以更好地反映路徑如何變化。

任何想法?謝謝!

回答

4

創建一個MKAnnotationView的子類,並使用該子類作爲拖動的註釋。在該子類:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    CLLocationCoordinate2D location = [_mapView convertPoint:self.center toCoordinateFromView:self.superview]; 
} 

遺憾的是,MKAnnotation對象與MKAnnotationView相關不更新其座標,直到MKAnnotationView被丟棄。所以你必須使用MKAnnotationView本身的位置,並將其轉換爲有效的座標。

這還需要引用已添加註釋的MKMapView(此處爲_mapView),您可以在創建時將其傳遞給視圖。

如果你已經設置了註解視圖的centerOffset屬性,還需要考慮爲:

CLLocationCoordinate2D location = [_mapView convertPoint:CGPointMake(self.center.x - self.centerOffset.x, self.center.y - self.centerOffset.y) toCoordinateFromView:self.superview]; 
+0

這個效果很好 - 謝謝:)我看到一個問題,但touchesMoved:withEvent:始終不會在第一次拖動時調用,偶爾也會在此之後調用。我看不出有什麼可能導致它。有什麼想法嗎? – StephenT

+0

使用touchesMoved將在大多數情況下工作,但是我注意到,當我拖動自定義引腳(特別是頂部)的某些部分時,touchesMoved不會被調用。我通過覆蓋中心屬性來解決這個問題。在Swift中,這很簡單:'override var center:CGPoint {didSet {// here here}}' – JYeh

1

免責聲明:我在Xamarin.iOS/MonoTouch的工作,但這種解決方案可以應用在Objective-C中也是如此,因爲大多數處理的問題都是相同的。

我按照Avario的建議創建了自定義註釋視圖,但touchesMoved事件從未被擊中。相反,我覆蓋了Center屬性(setCenter),並能夠以這種方式獲取座標變化。