我正在实现一个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];
}
答案 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:
;如果没有,你会想要改变它。