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将其放在另一个线程中。在显示时更改某些内容是不“合理的”;-)谢谢这有帮助。请看我在上面编辑的有点复杂(但有效)的解决方案。