1
votes

I'm trying to fit all annotations on my MKMapView while keeping the current user position in center of map.

There are already many references[1][2] on how to zoom out a region to fit annotations on the map but they will adjust the current center position e.g. if all annotations are located east of my current user position, it will adjust so the current user position is moved left of the map.

How can I zoom my map out so it will fit all annotations shown but keep the users current position in the center of the map?

Refs:

[1] Zooming MKMapView to fit annotation pins?

[2] - (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);

1
Try the following: Get the maximum distance to an annotation from the user location. Then use MKCoordinateRegionMakeWithDistance to set a region centered on the user location with a lat/long distance of maximumDistance*2. - user467105
It's a good idea and I came to the same conclusion yesterday but I'm not sure about the variables for MKCoordinateRegionMakeWithDistance since they take both a latitudinalMeters and a longitudinalMeters which I'm currently just setting as the same but I'm not sure you can do it that easily. I'll post my method in a couple of minutes. - Peter Theill
Yes, you can pass both as the same value and the map view will automatically adjust based on the proportions of the view and zoom level it can display. - user467105

1 Answers

2
votes

I found this solution to be the most reliable and @Anna suggested it as well so it might be an ok solution.

This is my method (implemented as a method of my inherited MKMapView

- (void)fitAnnotationsKeepingCenter {
  CLLocation *centerLocation = [[CLLocation alloc]
    initWithLatitude:self.centerCoordinate.latitude
    longitude:self.centerCoordinate.longitude];

  // starting distance (do not zoom less than this)
  CLLocationDistance maxDistance = 350;

  for (id <MKAnnotation> vehicleAnnotation in [self annotations]) {
    CLLocation *annotationLocation = [[CLLocation alloc] initWithLatitude:vehicleAnnotation.coordinate.latitude longitude:vehicleAnnotation.coordinate.longitude];
    maxDistance = MAX(maxDistance, [centerLocation distanceFromLocation:annotationLocation]);
  }

  MKCoordinateRegion fittedRegion = MKCoordinateRegionMakeWithDistance(centerLocation.coordinate, maxDistance * 2, maxDistance * 2);
  fittedRegion = [self regionThatFits:fittedRegion];
  fittedRegion.span.latitudeDelta *= 1.2;
  fittedRegion.span.longitudeDelta *= 1.2;

  [self setRegion:fittedRegion animated:YES];
}