在MKMapView中设置区域

时间:2013-04-04 06:43:46

标签: iphone ios objective-c mkmapview

我有10到15个拉特长,一次在地图上显示。我应该如何设置区域以便能够在地图上看到所有注释。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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];

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

答案 2 :(得分:2)

如果有人正在寻找Swift 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

答案 3 :(得分: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];
}

在Map View上设置所有Place(Annotation)之后调用此方法,例如..

 [self zoomToFitMapAnnotations:self.mapView];