根据服务器数据(纬度和经度)在MKMapView中移动注释

在我的应用程序中,我通过以特定间隔从服务器获取其位置(经度和纬度)来显示其他人的位置。

获得后,我必须删除所有注释,并根据服务器数据删除新的注释。

但它看起来效率非常低,因为当我们有相同的用户先前存在的注释,即使我删除和添加相同的用户注释。

所以我想知道我们是否可以将MKAnnotation从一个坐标移到另一个坐标? 我已经尝试过“设置协调”财产,但无法成功实施。

也不是“触摸和拖动”的一种。 当应用程序从服务器获取数据(纬度和经度)时,注释会自动移动。

为什么这是一个性能问题? 你有没有这种衣服? 你只是改变一个对象的数组,甚至不创build新的实例。

无论如何, MapView上的AnnotationView将被重用。 这不应该有任何问题。

要更改注释的坐标而不删除,重新创build并重新添加,请创build一个注释类,其coordinate属性可以设置。 一个简单的方法是像这样定义coordinate属性:

 @property (nonatomic, assign) CLLocationCoordinate2D coordinate; 

或者,也可以使用内置的具有可设置coordinate MKPointAnnotation类来代替定义自己的类。

您最初创build并添加注释照常。 例如:

 MKPointAnnotation *pa = [[MKPointAnnotation alloc] init]; pa.coordinate = someCoordinate; pa.title = @"User1"; [mapView addAnnotation:pa]; [pa release]; 

稍后,当您从服务器获取更新并更改“User1”的坐标时,可以在地图视图的annotations数组中search该用户的注释,或者将annotations的引用存储在允许使用键像一个NSMutableDictionary

一旦find注释,只需将注释的coordinate属性设置为新值,地图视图就会自动将注释的视图移动到新的位置。

这个例子searchannotations数组:

 for (id<MKAnnotation> ann in mapView.annotations) { if ([ann.title isEqualToString:@"User1"]) { ann.coordinate = theNewCoordinate; break; } } 

如果你想使用你的注解类的不同的自定义属性来find注解(比如说一些int名为userIdNumber):

 for (id<MKAnnotation> ann in mapView.annotations) { if ([ann isKindOfClass:[YourAnnotationClass class]]) { YourAnnotationClass *yacAnn = (YourAnnotationClass *)ann; if (yacAnn.userIdNumber == user1Id) { yacAnn.coordinate = theNewCoordinate; break; } } } 

以上只是如何改变坐标的一个例子。 如果你有很多注释和改变的坐标,我不build议一次一个地search它们。 相反,您可以将引用存储在字典中,并使用键值快速查找它们。