2009-12-16 38 views
17

我想讓我的應用程序的用戶在地圖中選擇一個位置。本地地圖具有「放置引腳」功能,您可以通過放置引腳來定位某些內容。我該如何在MapKit中做到這一點?如何使用MapKit放置一個別針?

+0

如果有一些我可以用我的答案來澄清。請告訴我。 – RedBlueThing 2010-08-16 13:05:23

+0

當寫這篇文章時,至少有兩個很好的答案可供選擇。拿你的選擇。 – JugsteR 2013-08-20 20:03:59

回答

27

你需要創建一個實現MKAnnotation協議的對象,然後將該對象添加到的MKMapView

@interface AnnotationDelegate : NSObject <MKAnnotation> { 
    CLLocationCoordinate2D coordinate; 
    NSString * title; 
    NSString * subtitle; 
} 

實例化的委託對象,並將其添加到地圖:

AnnotationDelegate * annotationDelegate = [[[AnnotationDelegate alloc] initWithCoordinate:coordinate andTitle:title andSubtitle:subt] autorelease]; 
[self._mapView addAnnotation:annotationDelegate]; 

地圖將訪問AnnotationDelegate上的座標屬性以找出在地圖上放置圖釘的位置。

如果您想自定義您的註解視圖,你將需要實現MKMapViewDelegateviewForAnnotation方法對您的地圖視圖控制器:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation 

如果你想實現的銷拖動功能,你可以請閱讀Apple OS Reference Library中有關處理註釋觸摸事件的內容。

您也可以使用mapkit拖拽this article,mapkit指GitHub上的工作示例庫。您可以通過檢查DDAnnotation對象上的_coordinates成員來獲取拖動註釋的座標。

+0

有一個很好的博客文章和示例代碼註釋拖放在這裏:http://hollowout.blogspot.com/2009/07/mapkit-annotation-drag-and-drop-with.html – RedBlueThing 2009-12-16 23:28:50

+0

事情是,即使你能夠拖動,拖動完成後,你能夠獲得該引腳的位置嗎? – erotsppa 2009-12-17 15:22:09

+0

我已經更新了我的答案,並詳細介紹了拖放操作。 – RedBlueThing 2009-12-20 13:11:53

23

有多種方法可以放置一個別針,而且您不會指定在問題中採用哪種方式。第一種方法是以編程方式進行,因爲您可以使用RedBlueThing編寫的內容,不過您並不需要自定義類(具體取決於您要定位的iOS版本)。對於iOS 4.0及更高版本,你可以使用這個片段以編程方式放置圖釘:

// Create your coordinate 
CLLocationCoordinate2D myCoordinate = {2, 2}; 
//Create your annotation 
MKPointAnnotation *point = [[MKPointAnnotation alloc] init]; 
// Set your annotation to point at your coordinate 
point.coordinate = myCoordinate; 
//If you want to clear other pins/annotations this is how to do it 
for (id annotation in self.mapView.annotations) { 
    [self.mapView removeAnnotation:annotation]; 
} 
//Drop pin on map 
[self.mapView addAnnotation:point]; 

如果你希望能夠放棄例如通過實際MapView的長按腳,可以這樣做:

// Create a gesture recognizer for long presses (for example in viewDidLoad) 
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 
lpgr.minimumPressDuration = 0.5; //user needs to press for half a second. 
[self.mapView addGestureRecognizer:lpgr] 


- (void)handleLongPress:(UIGestureRecognizer *)gestureRecognizer { 
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan) { 
     return; 
    } 
    CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView]; 
    CLLocationCoordinate2D touchMapCoordinate = [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView]; 
    MKPointAnnotation *point = [[MKPointAnnotation alloc] init]; 
    point.coordinate = touchMapCoordinate; 
    for (id annotation in self.mapView.annotations) { 
     [self.mapView removeAnnotation:annotation]; 
    } 
    [self.mapView addAnnotation:point]; 
} 

如果要枚舉所有註釋,只需在兩個代碼段中使用代碼即可。這是您如何記錄所有註釋的位置:

for (id annotation in self.mapView.annotations) { 
    NSLog(@"lon: %f, lat %f", ((MKPointAnnotation*)annotation).coordinate.longitude,((MKPointAnnotation*)annotation).coordinate.latitude); 
} 
+0

這個問題回答了@erotsppa問的問題 – JProgrammer 2015-06-18 20:35:11

2

您可能還需要設置MapView委託。

[mkMapView setDelegate:self]; 

然後調用其委託,viewForAnnotation

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{ 
    MKPinAnnotationView *pinAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation 
                    reuseIdentifier:@"current"]; 
    pinAnnotationView.animatesDrop = YES; 
    pinAnnotationView.pinColor = MKPinAnnotationColorRed; 
    return pinAnnotationView; 
} 
8

你可以得到觸摸的位置,jcesarmobile答案上得到挖掘coordinates with iphone mapkit,你可以刪除引腳的任何地方爲波紋管

// Define pin location 
CLLocationCoordinate2D pinlocation; 
pinlocation.latitude = 51.3883454 ;//set latitude of selected coordinate ; 
pinlocation.longitude = 1.4368011 ;//set longitude of selected coordinate; 

// Create Annotation point 
MKPointAnnotation *Pin = [[MKPointAnnotation alloc]init]; 
Pin.coordinate = pinlocation; 
Pin.title = @"Annotation Title"; 
Pin.subtitle = @"Annotation Subtitle"; 

// add annotation to mapview 
[mapView addAnnotation:Pin]; 
相關問題