iOS SDK Mapview注释标注重画错误

iOS SDK Mapview注释标注重画错误,ios,mkmapview,mkannotation,Ios,Mkmapview,Mkannotation,我试图在地图视图中添加从用户位置到选定注释字幕的距离。它的机制正在发挥作用,但实际的标注在第一次显示时就被弄乱了。似乎存在重新绘制的问题 在销上的后续轻敲显示正确的布局 以下是相关代码: //选择注释时调用 - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{ MKPointAnnotation *selectedAnnotation = view.annotation;

我试图在地图视图中添加从用户位置到选定注释字幕的距离。它的机制正在发挥作用,但实际的标注在第一次显示时就被弄乱了。似乎存在重新绘制的问题

在销上的后续轻敲显示正确的布局

以下是相关代码:

//选择注释时调用

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{

MKPointAnnotation *selectedAnnotation = view.annotation;

//attempt to add distance on annotation
CLLocation *pointALocation = [[CLLocation alloc] 
                              initWithLatitude:selectedAnnotation.coordinate.latitude 
                              longitude:selectedAnnotation.coordinate.longitude];
float distanceMeters = [pointALocation distanceFromLocation:locationManager.location];

//for sending info to detail
myPinTitle = selectedAnnotation.title;

[selectedAnnotation setSubtitle:[NSString stringWithFormat:@"%.2f miles away", (distanceMeters / 1609.344)]];
} 我尝试调用[view setNeedsDisplay],但没有结果

提前感谢你的帮助


有效的解决方案 这是我最后想出的解决办法。它似乎起作用了

我从上面的didSelectAnnotationView方法中编辑了重复的代码,并得出:

//called when user location changes

- (void)updatePinsDistance
{
for (int x=0; x< [[mapView annotations]count]; x++) {
    MKPointAnnotation *thisPin =[[mapView annotations] objectAtIndex:x];

    //attempt to add distance on annotation
    CLLocation *pointALocation = [[CLLocation alloc] 
                                 initWithLatitude:thisPin.coordinate.latitude 
                                 longitude:thisPin.coordinate.longitude];
    float distanceMeters = [pointALocation distanceFromLocation:locationManager.location];
    NSString *distanceMiles = [NSString stringWithFormat:@"%.2f miles from you",
                                                    (distanceMeters / 1609.344)];

    [thisPin setSubtitle:distanceMiles];
    }
}
//在用户位置更改时调用
-(无效)更新距离
{
对于(int x=0;x<[[mapView注释]计数];x++){
MKPointAnnotation*thisPin=[[mapView注释]对象索引:x];
//尝试在注释上添加距离
CLLocation*POINTALLOCATION=[[CLLocation ALLOCK]
initWithLatitude:thisPin.coordinate.latitude
经度:thisPin.coordinate.longitude];
浮点距离计=[PointLocation distanceFromLocation:locationManager.location];
NSString*distanceMiles=[NSString stringWithFormat:@“%.2f英里距离您”,
(测距仪/1609.344)];
[此PIN设置子标题:距离英里];
}
}

您应该在选择AnnotationView之外的其他位置设置字幕。实际上,在mapView:viewForAnnotation:method返回注释视图之前,所有注释视图都应该设置标题和副标题


您设置了一个长副标题这一事实肯定说明了标注的大小不正确。在调用didSelectAnnotationView之前,必须计算大小。

创建批注时会添加原始字幕,但我想显示当前用户位置到所选点的距离,因此无法添加该信息。此外,替换的距离字符串实际上可能比原始字符串小。相反,当用户位置更改时,应使用mapView:didUpdateUserLocation:delegate方法重新计算它。坦率地说,在显示标注时更改副标题是不合理的。因此,我是否应该在用户位置更改时更改每个注释的副标题,即使它永远看不见,而不仅仅是需要显示的注释?我不明白这怎么会更合理。你能详细说明一下吗?谢谢。正如我告诉过你的,标题和副标题应该在选择注释视图之前设置好。随后在didSelectAnnotationView中对其进行修改是详图索引未很好地重新绘制的最可能原因:所有尺寸都是在显示详图索引之前计算出来的。另一方面,设置字幕并不是一项昂贵的任务,您可以使用dispatch_async将其放在另一个线程中。在显示时更改某些内容是不“合理的”;-)谢谢这有帮助。请看我在上面编辑的有点复杂(但有效)的解决方案。