根据服务器数据(纬度和经度)在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它们。 相反,您可以将引用存储在字典中,并使用键值快速查找它们。