iOS SDK Mapview批注标注重绘错误

时间:2012-04-09 13:56:19

标签: ios mkmapview mkannotation

我正在尝试将用户位置的距离添加到地图视图中选定注释的副标题。它的机制正在工作,但实际的标注在第一次显示时就搞砸了。似乎有重绘问题。

mapView annotation redraw problem

引脚上的后续点击显示正确的布局。

以下是相关代码:

//选择注释时调用

- (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];
    }
}

1 个答案:

答案 0 :(得分:3)

您应该将字幕设置在didSelectAnnotationView之外的其他位置。实际上所有的annotationViews都应该在mapView:viewForAnnotation:method返回之前设置它们的标题和副标题。

您设置长字幕的事实肯定会说明标注不是正确的尺寸。必须在调用didSelectAnnotationView之前计算大小。