2014-11-09 3 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, когда перетаскивание начинается и заканчивается.
Это просто для целей отладки, поэтому вы увидите, что координаты фактически меняются.

Удачи.

Смежные вопросы