在做地图有关的程序时,我们经常需要用户在地图上指定位置我们再用大头针标记。

1、在viewDidLoad中添加我们要捕获的手势:

UILongPressGestureRecognizer *lpress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
lpress.minimumPressDuration
= 0.5;//按0.5秒响应longPress方法
lpress.allowableMovement = 10.0;
[m_mapView addGestureRecognizer:lpress];
//m_mapView是MKMapView的实例
[lpress release];

2、实现要响应的longPress方法:

- (void)longPress:(UIGestureRecognizer*)gestureRecognizer
{
if (gestureRecognizer.state == UIGestureRecognizerStateEnded){
return;
}


//坐标转换
CGPoint touchPoint = [gestureRecognizer locationInView:m_mapView];
CLLocationCoordinate2D touchMapCoordinate
=
[m_mapView convertPoint:touchPoint toCoordinateFromView:m_mapView];



MKPointAnnotation
* pointAnnotation = nil;
pointAnnotation
= [[MKPointAnnotation alloc] init];
pointAnnotation.coordinate
= touchMapCoordinate;
pointAnnotation.title
= @"名字";

[m_mapView addAnnotation:m_pointAnnotation];

[pointAnnotation release];

}

3,响应MKMapView的代理方法:

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

if ([annotation isKindOfClass:[MKUserLocation class]])
{
[self.navigationItem.rightBarButtonItem setEnabled:YES];
//导航栏右边回到当前位置的按钮可用
return nil;
}



static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
MKPinAnnotationView
* customPinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];

if (!customPinView) {
customPinView
= [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease];

customPinView.pinColor
= MKPinAnnotationColorRe;//设置大头针的颜色
customPinView.animatesDrop = YES;
customPinView.canShowCallout
= YES;
customPinView.draggable
= YES;//可以拖动

//添加tips上的按钮
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
customPinView.rightCalloutAccessoryView
= rightButton;
}
else{
customPinView.annotation
= annotation;
}
return customPinView;

}

4、实现showDetails方法:

- (void)showDetails:(UIButton*)sender
{

}
关于MKMapView的更多请参加apple的MapCallouts例子