Почему аннотация моей карты не сдвинулась? - PullRequest
1 голос
/ 15 августа 2011

Я реализую mapView, в котором будет размещена аннотация, когда пользователь ищет адрес. Но почему-то аннотация иногда не перемещается и не обновляется до новой координаты. Это только при увеличении карты, затем она обновится до нового местоположения. Подзаголовок действительно обновился, хотя.

- (void)searchBarSearchButtonClicked:(UISearchBar *)theSearchBar {
    SVGeocoder *geocodeRequest = [[SVGeocoder alloc] initWithAddress:searchBar.text inRegion:@"sg"];
    [geocodeRequest setDelegate:self];
    [geocodeRequest startAsynchronous];
}

- (void)geocoder:(SVGeocoder *)geocoder didFindPlacemark:(SVPlacemark *)placemark {
        if (annotation) {
            [annotation moveAnnotation:placemark.coordinate];
            annotation.subtitle = [NSString
                                   stringWithFormat:@"%@", placemark.formattedAddress];
        }
        else {
            annotation = [[MyAnnotation alloc]
                          initWithCoordinate:placemark.coordinate
                          title:@"Tap arrow to use address"
                          subtitle:[NSString
                                    stringWithFormat:@"%@", placemark.formattedAddress]];
            [mapView addAnnotation:annotation];
        }
    MKCoordinateSpan span;
    span.latitudeDelta = .001;
    span.longitudeDelta = .001;
    MKCoordinateRegion region;
    region.center = placemark.coordinate;
    region.span = span;
    [mapView setRegion:region animated:TRUE];

    [searchBar resignFirstResponder];
}

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Я не думаю, что MKMapView получает уведомление об изменениях местоположения аннотации.Документация MKAnnotation setCoordinate: гласит: «Аннотации, поддерживающие перетаскивание, должны реализовывать этот метод для обновления положения аннотации».так что, похоже, единственная цель этого метода - поддержка перетаскивания пинов.

Попробуйте удалить аннотацию из вида карты перед изменением ее координат, а затем добавьте ее обратно в вид карты.

1 голос
/ 15 августа 2011

Ничто в вашем коде (который вы показали) не говорит mapView, что местоположение аннотации изменилось.Сама аннотация, вероятно, не может сделать это в -moveAnnotation, потому что аннотации обычно не знают, к какой карте или картам они были добавлены (и не должны).

Правильный способ перемещения аннотации -чтобы удалить его из MKMapView, который его использует, обновить его местоположение, а затем добавить его обратно на карту.Вы не можете просто изменить местоположение аннотации после того, как она была добавлена ​​на карту, потому что карта может очень хорошо кэшировать местоположение или отсортировать аннотацию в соответствии с ее местоположением, и в MKMapView нет способа сообщить карте, что местоположение изменилось.

Я бы изменил ваше условие на что-то вроде этого:

if (annotation == nil) {
    annotation = [[MyAnnotation alloc] init];
    annotation.title = @"Tap arrow to use address";
}
[mapView removeAnnotation:annotation];
[annotation moveAnnotation:placemark.coordinate];
annotation.subtitle = placemark.formattedAddress;
[mapView addAnnotation:annotation];

Предполагается, что вместо -initWithCoordinate:title:subtitle: безопасно звонить -init;если нет, вы захотите изменить это.

...