2013-04-04 167 views
2

我有10 - 15 lat一次在地图上显示。我应该如何设置区域,以便我可以看到地图上的所有注释。在MKMapView设置区域

+1

http://stackoverflow.com/questions/5040175/iphone-mkmapview-set-map-region-to-show-all-pins-on-map – BhushanVU 2013-04-04 06:46:42

+0

你为什么不接受答案?这是一件体面的事情。 – wuf810 2014-08-23 22:06:12

回答

2

尝试像这可能是它可以帮助你,

 MKCoordinateSpan span = MKCoordinateSpanMake(52.0f,80.0001f); 
     CLLocationCoordinate2D coordinate = {8.9999, 18.2812}; 
     MKCoordinateRegion region = {coordinate, span}; 

     MKCoordinateRegion regionThatFits = [self.mapView regionThatFits:region]; 
     NSLog(@"Fit Region %f %f", regionThatFits.center.latitude, regionThatFits.center.longitude); 

     [self.mapView setRegion:regionThatFits animated:YES]; 

分别代替你的坐标和所有的值。

+0

@Amit:接受对您有用的清理社区的答案。 – Balu 2013-05-09 05:23:36

0

对于显示所有注释使用此方法,我在与您的问题相同的问题中使用此方法。它为我工作。

-(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(MYAnnotation* annotation in mapView.annotations)// here MYAnnotation is custom annotation call. 
    { 
     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); 

    } 

    NSLog(@"A%f, B%f, C%f, D%f,", topLeftCoord.latitude, topLeftCoord.longitude, bottomRightCoord.latitude, bottomRightCoord.longitude); 

    MKCoordinateRegion region; 
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5; 
    region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5; 
    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]; 
} 

调用此方法设置后的所有地方(译注)在地图上查看,例如像..

[self zoomToFitMapAnnotations:self.mapView]; 
4
create class as below. create two class: ViewController is class of UIViewController and MapViewAnnotation is class of NSObject. I have created that two class as below. bind mapview in XIB of ViewController and set delegate. 

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#import "MapViewAnnotation.h" 

@interface ViewController : UIViewController<MKMapViewDelegate>{ 
    IBOutlet MKMapView* mapView; 
    NSMutableArray *arrayLocation; 
} 
@end 


#import "ViewController.h" 

@implementation ViewController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    arrayLocation = [[NSMutableArray alloc]init]; 
    NSMutableArray *arrAnnotations = [[NSMutableArray alloc]init]; 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc]init]; 
    [dict setValue:@"32.774125" forKey:@"latitude"]; 
    [dict setValue:@"-117.240658" forKey:@"longitude"]; 
    [dict setValue:@"Bars & Restaurants 1" forKey:@"title"]; 
    [arrayLocation addObject:dict]; 
    dict = nil; 

    dict = [[NSMutableDictionary alloc]init]; 
    [dict setValue:@"32.784526" forKey:@"latitude"]; 
    [dict setValue:@"-117.240985" forKey:@"longitude"]; 
    [dict setValue:@"Bars & Restaurants 2" forKey:@"title"]; 
    [arrayLocation addObject:dict]; 
    dict = nil; 

    dict = [[NSMutableDictionary alloc]init]; 
    [dict setValue:@"32.773477" forKey:@"latitude"]; 
    [dict setValue:@"-117.241144" forKey:@"longitude"]; 
    [dict setValue:@"Bars & Restaurants 3" forKey:@"title"]; 
    [arrayLocation addObject:dict]; 
    dict = nil; 

    dict = [[NSMutableDictionary alloc]init]; 
    [dict setValue:@"32.775301" forKey:@"latitude"]; 
    [dict setValue:@"-117.238893" forKey:@"longitude"]; 
    [dict setValue:@"Bars & Restaurants 4" forKey:@"title"]; 
    [arrayLocation addObject:dict]; 
    dict = nil; 

    for(int i=0;i<[arrayLocation count];i++) 
    { 
     CLLocationCoordinate2D location; 
     location.latitude = [[[arrayLocation objectAtIndex:i] objectForKey:@"latitude"] doubleValue]; 
     location.longitude = [[[arrayLocation objectAtIndex:i] objectForKey:@"longitude"] doubleValue]; 


     MapViewAnnotation *newAnnotation = [[MapViewAnnotation alloc] initWithTitle:[[arrayLocation objectAtIndex:i] objectForKey:@"title"] Coordinate:location andIndex:i]; 
     [arrAnnotations addObject:newAnnotation]; 
    } 
    [mapView addAnnotations:arrAnnotations]; 
    mapView.region = [MapViewAnnotation regionForAnnotations:arrAnnotations]; 
} 
- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    if (annotation == mapView.userLocation) 
    { 
     return nil; 
    } 
    MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier: @"restMap"]; 
    if (pin == nil) 
    { 
     pin = [[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"restMap"]; 
    } 
    else 
    { 
     pin.annotation = annotation; 
    } 
    pin.pinColor = MKPinAnnotationColorRed; 
    pin.animatesDrop = NO; 
    pin.canShowCallout=TRUE; 
    UIButton *btn=[UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    MapViewAnnotation *temp = (MapViewAnnotation *)pin.annotation; 
    btn.tag=temp.index; 
    pin.rightCalloutAccessoryView=btn; 
    [btn addTarget:self action:@selector(openDetail:) forControlEvents:UIControlEventTouchUpInside]; 

    return pin; 
} 
@end 


Implementation of MapViewAnnotation class 

#import <MapKit/MapKit.h> 

@interface MapViewAnnotation : NSObject <MKAnnotation , MKMapViewDelegate>{ 
    NSString *title; 
    int index; 
    CLLocationCoordinate2D coordinate; 

} 

@property (nonatomic, copy) NSString *title; 
@property (nonatomic, readwrite) int index; 
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 

- (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d; 
- (id)initWithTitle:(NSString *)ttl Coordinate:(CLLocationCoordinate2D)c2d andIndex:(int)intIndex; 

+(MKCoordinateRegion) regionForAnnotations:(NSArray*) annotations ; 
@end 



#import "MapViewAnnotation.h" 


@implementation MapViewAnnotation 
@synthesize title, coordinate,index; 

- (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d { 
    self = [super init]; 
    title = ttl; 
    coordinate = c2d; 
    return self; 
} 

- (id)initWithTitle:(NSString *)ttl Coordinate:(CLLocationCoordinate2D)c2d andIndex:(int)intIndex 
{ 
    self = [super init]; 
    title = ttl; 
    coordinate = c2d; 
    index = intIndex; 
    return self; 
} 

+(MKCoordinateRegion) regionForAnnotations:(NSArray*) annotations 
{ 
    NSAssert(annotations!=nil, @"annotations was nil"); 
    NSAssert([annotations count]!=0, @"annotations was empty"); 

    double minLat=360.0f, maxLat=-360.0f; 
    double minLon=360.0f, maxLon=-360.0f; 

    for (id<MKAnnotation> vu in annotations) { 
     if (vu.coordinate.latitude < minLat) minLat = vu.coordinate.latitude; 
     if (vu.coordinate.latitude > maxLat) maxLat = vu.coordinate.latitude; 
     if (vu.coordinate.longitude < minLon) minLon = vu.coordinate.longitude; 
     if (vu.coordinate.longitude > maxLon) maxLon = vu.coordinate.longitude; 
    } 

    CLLocationCoordinate2D center = CLLocationCoordinate2DMake((minLat+maxLat)/2.0, (minLon+maxLon)/2.0); 
    MKCoordinateSpan span = MKCoordinateSpanMake(maxLat-minLat, maxLon-minLon); 
    MKCoordinateRegion region = MKCoordinateRegionMake (center, span); 

    return region; 
} 

@end 
0

如果有人正在寻找斯威夫特3解决方案,我已经写了这快速扩展,都非常好,我:)

public extension MKMapView { 
    public static func visibleRect(for coords: [CLLocationCoordinate2D]) -> MKMapRect { 
     return coords.reduce(MKMapRectNull) { outRect, coord in 
      let point = MKMapPointForCoordinate(coord) 
      let rect = MKMapRectMake(point.x, point.y, 0.1, 0.1) 
      let union = MKMapRectUnion(rect, outRect) 

      return union 
     } 
    } 

    public func fitCoordinates(_ coords: [CLLocationCoordinate2D], 
           animated: Bool = true, 
           insets: UIEdgeInsets = UIEdgeInsets(top: 25, left: 25, bottom: 25, right: 25)) { 
     let rect = MKMapView.visibleRect(for: coords) 
     self.setVisibleMapRect(rect, edgePadding: insets, animated: animated) 
    } 
} 

它允许快速完成:

map.fitCoordinates([userLocation, location1, location2]) 

希望这有助于任何人!

要点在这里:https://gist.github.com/freak4pc/1748322a1b8bba23b6de3f47cb00c3ea