如何在mapview中拖动注释引脚?

时间:2014-11-09 08:30:18

标签: ios objective-c mapkit

我在Map View中有一个初始丢弃的引脚。

我想要完成的是将该引脚拖动到地图中的任何位置,并从该引脚获取新坐标。怎么做?我应该添加什么?

我有这种方法,我可以在其中执行初始丢弃引脚。

- (void) performSearch
{
    MKLocalSearchRequest *request =
    [[MKLocalSearchRequest alloc] init];
    request.naturalLanguageQuery = _searchString;
    request.region = _mapView.region;

    _matchingItems = [[NSMutableArray alloc] init];

    MKLocalSearch *search =
    [[MKLocalSearch alloc]initWithRequest:request];

    [search startWithCompletionHandler:^(MKLocalSearchResponse
                                         *response, NSError *error) {
        if (response.mapItems.count == 0)
        NSLog(@"No Matches");
        else
        for (MKMapItem *item in response.mapItems)
        {
            [_matchingItems addObject:item];
            annotation = [[MKPointAnnotation alloc]init];
            annotation.coordinate = item.placemark.coordinate;
            annotation.title = item.name;
            [_mapView addAnnotation:annotation];


            MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (annotation.coordinate, 800, 800);
            [_mapView setRegion:region animated:NO];
        }
    }];

}

1 个答案:

答案 0 :(得分:2)

首先,遵守MKMapViewDelegate

//ViewController.m  
@interface ViewController () <MKMapViewDelegate>  
@end  

然后,将地图视图的委托设置为self

-(void)viewDidLoad {  
    [super viewDidLoad];  
    _mapView.delegate = self;  
    ...  
    ...  
  }  

然后实现以下两个委托方法。

第一个委托方法返回与注释对象关联的视图,并将此视图设置为可拖动,
第二种方法,处理注释视图的拖动状态。

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation {  
    MKPinAnnotationView *pin = (MKPinAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:@"pin"];  

  if(!pin) {  
      pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reueseIdentifier:@"pin"];  
    } else {  
      pin.annotation = annotation;  
    }  

  pin.draggable = YES;  

  return pin;  
}  

这里我们要求MKPinAnnotationView标识符@“pin”,
如果我们没有收到回来,我们就是创建它 然后我们将视图设置为可拖动。

以上内容足以移动,因此更改注释的坐标 如果您想在设置新坐标时调用某个方法,可以使用第二个委托方法执行此操作 -

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState {  
  {  
      if(newState == MKAnnotationViewDragStateStarting)  {  
        NSLog(@"%f, %f", view.annotation.coordinate.latitude, view.annotation.coordinate.longitude);  
        }  

      if(newState == MKAnnotationViewDragStateEnding) {  
        NSLog(@"%f, %f", view.annotation.coordinate.latitude, view.annotation.coordinate.longitude);  
        // Here you can call whatever you want to happen when to annotation coordinates changes  
        }  
  }  

在这里确定拖动实际结束的时间,然后您可以调用任何您喜欢的方法来处理新坐标。

请注意,当拖动开始和结束时,我还包含NSLog来电 这仅用于调试目的,因此您将看到坐标实际上正在被更改。

祝你好运。