我添加了一堆注释,并将它们存储在一个数组中,这样我就可以拉入它们的新位置并相应地更新 map ,而无需先删除所有注释并添加它们,这会导致闪烁。不幸的是,在最初设置并添加了它们的坐标后,任何 setCoordinate 调用都不再有效。有什么想法吗?
- (void)updateMap:(NSData *)responseData {
//parse out the JSON data
NSError* error;
vehicleData = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
//find which Dictionary is for our bus.
for (NSDictionary* route in vehicleData) {
//find our bus in our vehicles dictionary. Key is by routeID.
BusPositionDot *busLocationDot;
if ([vehicles objectForKey:[route objectForKey:@"RouteID"]] == nil) {
busLocationDot = [[BusPositionDot alloc] init];
[vehicles setObject:busLocationDot forKey:[route objectForKey:@"RouteID"]];
[mapView addAnnotation:[vehicles objectForKey:[route objectForKey:@"RouteID"]]];
}
else {
busLocationDot = [vehicles objectForKey:@"RouteID"];
}
float latitude = [[route objectForKey:@"Latitude"] floatValue];
float longitude = [[route objectForKey:@"Longitude"] floatValue];
float groundSpeed = [[route objectForKey:@"GroundSpeed"] floatValue];
float direction = [[route objectForKey:@"Heading"] floatValue];
float roundedDirection=45 * round(direction/45);
if(groundSpeed<=3)
//get view for annotation
[mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot.png"];
else if((roundedDirection==0)||(roundedDirection==360))
[mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot0.png"];
else if(roundedDirection==45)
[mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot45.png"];
else if(roundedDirection==90)
[mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot90.png"];
else if(roundedDirection==135)
[mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot135.png"];
else if(roundedDirection==180)
[mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot180.png"];
else if(roundedDirection==225)
[mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot225.png"];
else if(roundedDirection==270)
[mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot270.png"];
else if(roundedDirection==315)
[mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot315.png"];
CLLocationCoordinate2D currentBusLocation = CLLocationCoordinate2DMake(latitude, longitude);
NSLog(@"setting coord %f & %f",currentBusLocation.latitude,currentBusLocation.longitude);
[UIView animateWithDuration:0.5 animations:^{
[busLocationDot setCoordinate:currentBusLocation];
}];
}
}
最佳答案
引用这部分:
if ([vehicles objectForKey:[route objectForKey:@"RouteID"]] == nil) {
...
[mapView addAnnotation:
[vehicles objectForKey:[route objectForKey:@"RouteID"]]];
}
else {
busLocationDot = [vehicles objectForKey:@"RouteID"];
}
当您调用 addAnnotation
时,您传递:
[vehicles objectForKey:[route objectForKey:@"RouteID"]]
但如果它已经存在,你使用:
[vehicles objectForKey:@"RouteID"]
这意味着在更新注释时,正在使用不同的(很可能是错误的)引用。
[vehicles objectForKey:@"RouteID"]
实际上不是 BusPositionDot
或者它不是最初添加该“路线 ID”的同一个实例。
因此,setCoordinate
将不起作用。
更新注释时使用相同的引用应该可以修复它。
还有一些其他不相关的潜在问题:
代码使用
float
变量(例如if(roundedDirection==45)
)进行直接比较。不推荐这样做,即使它“看起来可行”——可能会出现浮点精度错误。检查roundedDirection
是否在目标值的非常小的范围内,或者在您的情况下,只需将roundedDirection
声明为int
因为它看起来喜欢表达
45 * round(direction/45)
将只返回没有小数的值。代码是直接设置注解 View 的
image
。这没问题,但要确保viewForAnnnotation
委托(delegate)方法也具有相同的逻辑来根据方向设置image
否则可能发生的是注释 View 的图像将被重置为平移或缩放时的一些默认值。您可能需要将direction
属性添加到BusPositionDot
。
关于ios - 在我的 mapView 上添加注释后设置坐标更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13687935/