我有一个应用程序,在地图视图上绘制mkannotations(我希望我的术语正确......有点令人困惑)。
我已经在你点击它们时加入了副标题。
我一直在网上寻找一种方法来包含那些标注中的距离,但我还没有完成。我遇到了两个局部解决方案,我想知道它们是否应该合并。
首先,我没有将CoreLocation添加到我的项目中,我需要它吗?要不断更新我的用户位置并能够计算到每个点的距离?或者Mapkit以某种方式包含我可以使用的用户位置数据?
部分解决方案A使用此代码:
` - (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
if(!newLocation) return;
if ((oldLocation.coordinate.latitude != newLocation.coordinate.latitude) &&
(oldLocation.coordinate.longitude != newLocation.coordinate.longitude)){
CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:oldLocation.coordinate.latitude longitude:oldLocation.coordinate.longitude];
CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude];
CLLocationDistance distance = ([loc2 distanceFromLocation:loc1]) * 0.000621371192;
//distance = distance;
NSLog(@"Total Distance %f in miles",distance);
}
}
我理解这种方法计算2点之间的距离。我会以某种方式通过我的注释循环并创建距离。这似乎更有用,因为它会根据当前的userLocation不断重新计算距离。虽然,我确实想知道它的有效性。一旦你知道一些东西有多远,你很少希望不断被提醒它有多远。
` - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
CLLocation *pinLocation = [[[CLLocation alloc] initWithLatitude:[(MyAnnotation*)[view annotation] coordinate].latitude longitude:[(MyAnnotation*)[view annotation] coordinate].longitude]];
CLLocation *userLocation = [[CLLocation alloc] initWithLatitude:self._mapView.userLocation.coordinate.latitude longitude:self._mapView.userLocation.coordinate.longitude];
CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation];
NSLog(@"Distance to pin %4.0f", distance);
} `
在这种情况下,无论何时敲击引脚,都会计算距离。但我不清楚MyAnnotation的代码[查看注释],我猜测原始海报的位置基于MyAnnotation类,所以我将其更改为MyLocation,除了1个错误之外的所有错误都消失了。由于某种原因,我在最后一个方括号的pinLocation行得到了一个Expected Identifier错误。
我觉得解决方案在我的舌尖。只需要额外的推动:)
谢谢你们
答案 0 :(得分:0)
只需将calloutAccessoryControlTapped方法中的代码移动到创建MKAnnotation的行(无论您拥有它的任何位置)之后。为MKAnnotation子类提供浮点距离属性并将其设置为副标题。