19

我想允许我的应用程序的用户在地图中选择一个位置。原生地图具有“放置图钉”功能,您可以通过放置图钉来定位某物。如何在 MapKit 中做到这一点?

4

4 回答 4

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 上的坐标属性,以找出在地图上放置图钉的位置。

如果要自定义注释视图,则需要在 Map View Controller 上实现MKMapViewDelegate viewForAnnotation方法:

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

如果您想实现引脚拖动功能,您可以在Apple OS 参考库中阅读有关处理注释触摸事件的信息。

您还可以查看这篇关于使用 mapkit 拖放的文章,它指的是GitHub 上的一个工作示例库。您可以通过检查DDAnnotation对象上的_coordinates成员来获取被拖动注释的坐标。

于 2009-12-16T23:25:19.527 回答
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);
}
于 2012-12-11T09:03:48.910 回答
9

您可以通过jcesarmobile回答使用 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];
于 2015-04-07T06:26:27.473 回答
3

您可能还需要设置 MapView Delegate。

[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;
}
于 2013-01-28T07:58:50.503 回答