为什么我的地图注释没有移动?

时间:2011-08-15 07:53:12

标签: iphone annotations android-mapview

我正在实现一个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 个答案:

答案 0 :(得分:2)

我不认为MKMapView会收到有关注释位置更改的通知。 MKAnnotation的setCoordinate:文档说:“支持拖动的注释应该实现此方法来更新注释的位置。”因此,这种方法的唯一目的似乎是支持拖动引脚。

尝试在更改坐标之前从地图视图中删除注释,然后将其添加回地图视图。

答案 1 :(得分:1)

您的代码中没有任何内容(您已经显示过)告诉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];

这假设可以安全地拨打-init来代替-initWithCoordinate:title:subtitle:;如果没有,你会想要改变它。