How to add distance to pin of an MKAnnotation?

2019-08-29 10:00发布

问题:

Ive got an app that plots mkannotations (i hope i get my terminology right...its kinda confusing) on a mapview.

I have already included the subtitle for when you tap on them.

I have been looking online for a way to include the distance in those callouts but im not quite there yet. I ran across two partial solutions and Im wondering if they should be combined.

  1. First, I didnt have CoreLocation added to my project, I need it right? To be constantly updating my user location and be able to calculate the distances to each point? Or does Mapkit somehow include a user location data that I can use?

  2. Partial Solution A uses this code:

`-(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);

}   

}

I understand this method calculates the distance between 2 points. I would somehow need to cycle thru my annotations and create the distance. It seems this would be the more useful one since it constantly recalculates the distances based on the current userLocation. Although, I do wonder about the effectiveness of that. Once you know how far away something is, you rarely wish to be constantly reminded as to how far away it is.

  1. Partial Solution B uses this code:

`- (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);

} `

In this case, whenever the pin is tapped, the distance is calculated. But Im unclear as to the code for MyAnnotation [view annotation], Im guessing the original poster had his locations based off of a MyAnnotation Class so I changed it to MyLocation and all but 1 error went away. I get an Expected Identifier error at the pinLocation line at the last square bracket for some reason.

I feel the solution is in the tip of my tongue. Just need that little extra push :)

Thanks guys

回答1:

Just move the code inside the calloutAccessoryControlTapped method right after the line, wherever you have it, that creates the MKAnnotation. Give MKAnnotation subclass a float distance property and set it as the subtitle.