2014-11-09 60 views
1

我在地圖視圖中有一個初始放置的引腳。如何在mapview中拖動註釋引腳?

我想要完成的是在地圖上的任意位置拖動該針腳,並從該針腳獲取新的座標。怎麼做?我應該添加什麼?

我有這種方法,我做初始放置引腳。

- (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]; 
     } 
    }]; 

} 

回答

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用的標識符@「針」,
如果我們沒有收到一回,我們只是創建它。
然後我們將視圖設置爲可拖動。

以上可能足以移動註釋的座標並因此更改註釋的座標。
如果您想在新的座標就調用一些方法,你可以用第二委託做這個方法 -

-(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調用。
這只是爲了調試目的,所以你會看到座標實際上正在改變。

祝你好運夥計。