Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Positioning MKMapView to show multiple annotations at once

I've got several annotations I want to add to my MKMapView (it could 0-n items, where n is generally around 5). I can add the annotations fine, but I want to resize the map to fit all annotations onscreen at once, and I'm not sure how to do this.

I've been looking at -regionThatFits: but I'm not quite sure what to do with it. I'll post some code to show what I've got so far. I think this should be a generally straightforward task but I'm feeling a bit overwhelmed with MapKit so far.

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{  location = newLocation.coordinate; //One location is obtained.. just zoom to that location  MKCoordinateRegion region; region.center = location;  //Set Zoom level using Span MKCoordinateSpan span; span.latitudeDelta = 0.015; span.longitudeDelta = 0.015; region.span = span; // Set the region here... but I want this to be a dynamic size // Obviously this should be set after I've added my annotations [mapView setRegion:region animated:YES];  // Test data, using these as annotations for now NSArray *arr = [NSArray arrayWithObjects:@"one", @"two", @"three", @"four", nil]; float ex = 0.01; for (NSString *s in arr) {     JBAnnotation *placemark = [[JBAnnotation alloc] initWithLat:(location.latitude + ex) lon:location.longitude];     [mapView addAnnotation:placemark];     ex = ex + 0.005; }     // What do I do here?     [mapView setRegion:[mapView regionThatFits:region] animated:YES]; } 

Notice, this all happens as I receive a location update... I don't know if that's an appropriate place to do this. If not, where would be a better place? -viewDidLoad?

Thanks in advance.

like image 675
jbrennan Avatar asked Aug 26 '09 17:08

jbrennan


1 Answers

The link posted by Jim is now dead, but i was able to find the code (which I had bookmarked somewhere). Hope this helps.

- (void)zoomToFitMapAnnotations:(MKMapView *)mapView {      if ([mapView.annotations count] == 0) return;       CLLocationCoordinate2D topLeftCoord;      topLeftCoord.latitude = -90;      topLeftCoord.longitude = 180;       CLLocationCoordinate2D bottomRightCoord;      bottomRightCoord.latitude = 90;      bottomRightCoord.longitude = -180;       for(id<MKAnnotation> annotation in mapView.annotations) {          topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude);          topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude);          bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude);          bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude);      }       MKCoordinateRegion region;      region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5;      region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5;            // Add a little extra space on the sides     region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1;     region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1;       region = [mapView regionThatFits:region];      [mapView setRegion:region animated:YES];  } 
like image 173
Mustafa Avatar answered Sep 28 '22 06:09

Mustafa