如何使用MapKit删除引脚?

时间:2009-12-16 20:18:21

标签: iphone google-maps mkmapview user-input mkannotation

我想允许我的应用的用户在地图中选择一个位置。原生地图有一个“drop pin”功能,您可以通过放置引脚来定位。我怎么能在MapKit中做到这一点?

4 个答案:

答案 0 :(得分: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 Reference Library中有关处理注释触摸事件的信息。

您还可以使用mapkit查看有关拖放的this article,其中涉及GitHub上的工作样本库。您可以通过检查 DDAnnotation 对象上的 _coordinates 成员来获取拖动注释的坐标。

答案 1 :(得分: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);
}

答案 2 :(得分: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];

答案 3 :(得分: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;
}