1

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

Community
  • 1
  • 1
Peter Theill
  • 3,117
  • 2
  • 27
  • 29
  • 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. –  Oct 18 '14 at 11:52
  • 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 Oct 18 '14 at 12:55
  • 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. –  Oct 18 '14 at 15:18

1 Answers1

2

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];
}
Peter Theill
  • 3,117
  • 2
  • 27
  • 29