MKMapView缩放显示全部annotation

在地图上加载许多annotation,是不是想一屏幕显示完所有的annotation?下面代码就可以实现。

  1. #define MINIMUM_ZOOM_ARC 0.014 //approximately 1 miles (1 degree of arc ~= 69 miles)  
  2. #define ANNOTATION_REGION_PAD_FACTOR 1.15  
  3. #define MAX_DEGREES_ARC 360  
  4. //size the mapView region to fit its annotations  
  5. - (void)zoomMapViewToFitAnnotations:(MKMapView *)mapView animated:(BOOL)animated  
  6. {   
  7.     NSArray *annotations = mapView.annotations;  
  8.     int count = [mapView.annotations count];  
  9.     if ( count == 0) { return; } //bail if no annotations  
  10.       
  11.     //convert NSArray of id <MKAnnotation> into an MKCoordinateRegion that can be used to set the map size  
  12.     //can't use NSArray with MKMapPoint because MKMapPoint is not an id  
  13.     MKMapPoint points[count]; //C array of MKMapPoint struct  
  14.     forint i=0; i<count; i++ ) //load points C array by converting coordinates to points  
  15.     {  
  16.         CLLocationCoordinate2D coordinate = [(id <MKAnnotation>)[annotations objectAtIndex:i] coordinate];  
  17.         points[i] = MKMapPointForCoordinate(coordinate);  
  18.     }  
  19.     //create MKMapRect from array of MKMapPoint  
  20.     MKMapRect mapRect = [[MKPolygon polygonWithPoints:points count:count] boundingMapRect];  
  21.     //convert MKCoordinateRegion from MKMapRect  
  22.     MKCoordinateRegion region = MKCoordinateRegionForMapRect(mapRect);  
  23.       
  24.     //add padding so pins aren't scrunched on the edges  
  25.     region.span.latitudeDelta  *= ANNOTATION_REGION_PAD_FACTOR;  
  26.     region.span.longitudeDelta *= ANNOTATION_REGION_PAD_FACTOR;  
  27.     //but padding can't be bigger than the world  
  28.     if( region.span.latitudeDelta > MAX_DEGREES_ARC ) { region.span.latitudeDelta  = MAX_DEGREES_ARC; }  
  29.     if( region.span.longitudeDelta > MAX_DEGREES_ARC ){ region.span.longitudeDelta = MAX_DEGREES_ARC; }  
  30.       
  31.     //and don't zoom in stupid-close on small samples  
  32.     if( region.span.latitudeDelta  < MINIMUM_ZOOM_ARC ) { region.span.latitudeDelta  = MINIMUM_ZOOM_ARC; }  
  33.     if( region.span.longitudeDelta < MINIMUM_ZOOM_ARC ) { region.span.longitudeDelta = MINIMUM_ZOOM_ARC; }  
  34.     //and if there is a sample of 1 we want the max zoom-in instead of max zoom-out  
  35.     if( count == 1 )  
  36.     {   
  37.         region.span.latitudeDelta = MINIMUM_ZOOM_ARC;  
  38.         region.span.longitudeDelta = MINIMUM_ZOOM_ARC;  
  39.     }  
  40.     [mapView setRegion:region animated:animated];  
  41. }  
  42.   
  43. - (void)viewWillAppear:(BOOL)animated  
  44. {  
  45.     [self zoomMapViewToFitAnnotations:self.mapView animated:animated];  
  46.     //or maybe you would do the call above in the code path that sets the annotations array  
  47. }  

你可能感兴趣的:(MKMapView缩放显示全部annotation)