Positioning MKMapView om meerdere annotaties tegelijk tonen

stemmen
89

Ik heb diverse aantekeningen ik wil toevoegen aan mijn MKMapView kreeg (het kon 0-n items, waarbij n is over het algemeen ongeveer 5). Ik kan de annotaties prima, maar ik wil de kaart om alle aantekeningen op het scherm in een keer passen formaat, en ik ben niet zeker hoe dit te doen.

Ik ben al op zoek naar -regionThatFits:, maar ik ben niet helemaal zeker wat te doen. Ik zal wat code te posten om te laten zien wat ik tot dusver heb. Ik denk dat dit zou een algemeen eenvoudige taak zijn, maar ik voel me een beetje overdonderd met MapKit tot nu toe.

- (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];
}

Let op, dit alles gebeurt als ik een locatie-update te ontvangen ... Ik weet niet of dat is een geschikte plaats om dit te doen. Zo niet, waar zou een betere plaats zijn? -viewDidLoad?

Bij voorbaat bedankt.

De vraag is gesteld op 26/08/2009 om 18:35
bron van user
In andere talen...                            


23 antwoorden

stemmen
133

De koppeling geplaatst door Jim is nu dood, maar ik was in staat om de code te vinden (die ik ergens had bladwijzer). Ik hoop dat dit helpt.

- (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]; 
}
antwoordde op 26/08/2011 om 07:22
bron van user

stemmen
132

Waarom zo ingewikkeld?

MKCoordinateRegion coordinateRegionForCoordinates(CLLocationCoordinate2D *coords, NSUInteger coordCount) {
    MKMapRect r = MKMapRectNull;
    for (NSUInteger i=0; i < coordCount; ++i) {
        MKMapPoint p = MKMapPointForCoordinate(coords[i]);
        r = MKMapRectUnion(r, MKMapRectMake(p.x, p.y, 0, 0));
    }
    return MKCoordinateRegionForMapRect(r);
}
antwoordde op 08/08/2012 om 11:41
bron van user

stemmen
43

Ik heb iets gelijkend op dit om uit te zoomen (of in) gedaan om een ​​gebied dat een punt annotatie en de huidige locatie inbegrepen. U kunt dit uitbreiden door het doorlopen van uw annotaties.

De basisstappen zijn:

  • Bereken de min lengte / breedte
  • Bereken de maximale lengte / breedte
  • Maak CLLocation-objecten voor deze twee punten
  • Bereken afstand tussen de punten
  • Regio maken gebruik middelpunt tussen de punten en de afstand omgezet naar graden
  • Pass regio in MapView aan te passen
  • Gebruik aangepaste regio tot regio MapView stellen
    -(IBAction)zoomOut:(id)sender {

        CLLocationCoordinate2D southWest = _newLocation.coordinate;
        CLLocationCoordinate2D northEast = southWest;

        southWest.latitude = MIN(southWest.latitude, _annotation.coordinate.latitude);
        southWest.longitude = MIN(southWest.longitude, _annotation.coordinate.longitude);

        northEast.latitude = MAX(northEast.latitude, _annotation.coordinate.latitude);
        northEast.longitude = MAX(northEast.longitude, _annotation.coordinate.longitude);

        CLLocation *locSouthWest = [[CLLocation alloc] initWithLatitude:southWest.latitude longitude:southWest.longitude];
        CLLocation *locNorthEast = [[CLLocation alloc] initWithLatitude:northEast.latitude longitude:northEast.longitude];

        // This is a diag distance (if you wanted tighter you could do NE-NW or NE-SE)
        CLLocationDistance meters = [locSouthWest getDistanceFrom:locNorthEast];

        MKCoordinateRegion region;
        region.center.latitude = (southWest.latitude + northEast.latitude) / 2.0;
        region.center.longitude = (southWest.longitude + northEast.longitude) / 2.0;
        region.span.latitudeDelta = meters / 111319.5;
        region.span.longitudeDelta = 0.0;

        _savedRegion = [_mapView regionThatFits:region];
        [_mapView setRegion:_savedRegion animated:YES];

        [locSouthWest release];
        [locNorthEast release];
    }
antwoordde op 27/08/2009 om 20:56
bron van user

stemmen
36

Vanaf iOS7 u kunt gebruiken showAnnotations: geanimeerd:

[mapView showAnnotations:annotations animated:YES];
antwoordde op 22/03/2014 om 02:27
bron van user

stemmen
21

Ik heb een ander antwoord. Ik was van plan om te doen uitvoering van de zoom-to-fit-algoritme mezelf, maar ik dacht dat Apple moet een manier om te doen wat we wilden zonder zoveel werk hebben. Het gebruik van de API doco snel bleek dat ik MKPolygon kon gebruiken om te doen wat nodig was:

/* this simply adds a single pin and zooms in on it nicely */
- (void) zoomToAnnotation:(MapAnnotation*)annotation {
    MKCoordinateSpan span = {0.027, 0.027};
    MKCoordinateRegion region = {[annotation coordinate], span};
    [mapView setRegion:region animated:YES];
}

/* This returns a rectangle bounding all of the pins within the supplied
   array */
- (MKMapRect) getMapRectUsingAnnotations:(NSArray*)theAnnotations {
    MKMapPoint points`theAnnotations count`;

    for (int i = 0; i < [theAnnotations count]; i++) {
        MapAnnotation *annotation = [theAnnotations objectAtIndex:i];
        points[i] = MKMapPointForCoordinate(annotation.coordinate);
    }

    MKPolygon *poly = [MKPolygon polygonWithPoints:points count:[theAnnotations count]];

    return [poly boundingMapRect];
}

/* this adds the provided annotation to the mapview object, zooming 
   as appropriate */
- (void) addMapAnnotationToMapView:(MapAnnotation*)annotation {
    if ([annotations count] == 1) {
        // If there is only one annotation then zoom into it.
        [self zoomToAnnotation:annotation];
    } else {
        // If there are several, then the default behaviour is to show all of them
        //
        MKCoordinateRegion region = MKCoordinateRegionForMapRect([self getMapRectUsingAnnotations:annotations]);

        if (region.span.latitudeDelta < 0.027) {
            region.span.latitudeDelta = 0.027;
        }

        if (region.span.longitudeDelta < 0.027) {
            region.span.longitudeDelta = 0.027;
        }
        [mapView setRegion:region];
    }

    [mapView addAnnotation:annotation];
    [mapView selectAnnotation:annotation animated:YES];
}

Ik hoop dat dit helpt.

antwoordde op 04/10/2011 om 02:50
bron van user

stemmen
14

je kunt ook doen het op deze manier ..

// Position the map so that all overlays and annotations are visible on screen.
MKMapRect regionToDisplay = [self mapRectForAnnotations:annotationsToDisplay];
if (!MKMapRectIsNull(regionToDisplay)) myMapView.visibleMapRect = regionToDisplay;

- (MKMapRect) mapRectForAnnotations:(NSArray*)annotationsArray
{
    MKMapRect mapRect = MKMapRectNull;

    //annotations is an array with all the annotations I want to display on the map
    for (id<MKAnnotation> annotation in annotations) { 

        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);

        if (MKMapRectIsNull(mapRect)) 
        {
            mapRect = pointRect;
        } else 
        {
            mapRect = MKMapRectUnion(mapRect, pointRect);
        }
    }

     return mapRect;
}
antwoordde op 12/09/2011 om 05:59
bron van user

stemmen
12

Op basis van de informatie en suggesties van iedereen kwam ik met het volgende. Bedankt voor iedereen in deze discussie om bij te dragen :) Dit zou gaan in de weergave Controller dat de Mapview bevat.

- (void)zoomToFitMapAnnotations { 

if ([self.mapView.annotations count] == 0) return; 

int i = 0;
MKMapPoint points`self`.`mapView`.`annotations count`;

//build array of annotation points
for (id<MKAnnotation> annotation in [self.mapView annotations])
        points[i++] = MKMapPointForCoordinate(annotation.coordinate);

MKPolygon *poly = [MKPolygon polygonWithPoints:points count:i];

[self.mapView setRegion:MKCoordinateRegionForMapRect([poly boundingMapRect]) animated:YES]; 
}
antwoordde op 20/10/2011 om 21:00
bron van user

stemmen
5

In mijn geval ben ik beginnen met CLLocation objecten en het maken van aantekeningen voor elk van hen.
Ik hoef alleen maar om twee annotaties te plaatsen, dus ik heb een eenvoudige benadering van de bouw van de reeks van punten, maar het kan gemakkelijk worden uitgebreid tot een array met een willekeurige lengte krijgen een set van CLLocations bouwen.

Hier is mijn implementatie (niet vereist het creëren van MKMapPoints):

//start with a couple of locations
CLLocation *storeLocation = store.address.location.clLocation;
CLLocation *userLocation = [LBLocationController sharedController].currentLocation;

//build an array of points however you want
CLLocationCoordinate2D points[2] = {storeLocation.coordinate, userLocation.coordinate};

//the magic part
MKPolygon *poly = [MKPolygon polygonWithCoordinates:points count:2];
[self.mapView setRegion:MKCoordinateRegionForMapRect([poly boundingMapRect])];
antwoordde op 25/01/2012 om 21:11
bron van user

stemmen
4

Met behulp van Swift, een veelhoek, en een aantal extra vulling gebruikte ik het volgende:

func zoomToFit() {
    var allLocations:[CLLocationCoordinate2D] = [
        CLLocationCoordinate2D(latitude: 32.768805, longitude: -117.167119),
        CLLocationCoordinate2D(latitude: 32.770480, longitude: -117.148385),
        CLLocationCoordinate2D(latitude: 32.869675, longitude: -117.212929)
    ]

    var poly:MKPolygon = MKPolygon(coordinates: &allLocations, count: allLocations.count)

    self.mapView.setVisibleMapRect(poly.boundingMapRect, edgePadding: UIEdgeInsetsMake(40.0, 40.0, 40.0, 40.0), animated: false)
}

antwoordde op 06/04/2015 om 15:46
bron van user

stemmen
3

Er is een nieuwe methode in 'MKMapView' als van iOS 7 die u kunt gebruiken

Verklaring

SNEL

func showAnnotations(_ annotations: [AnyObject]!,
            animated animated: Bool)

DOELSTELLING C

- (void)showAnnotations:(NSArray *)annotations
               animated:(BOOL)animated

parameters

annotaties De aantekeningen die u wilt op de kaart zichtbaar te zijn. geanimeerde YES als u de kaart regio verandering te worden geanimeerd, of NEE als u wilt dat de kaart om het nieuwe gebied onmiddellijk weer te geven zonder animaties.

Discussie

Het aanroepen van deze methode Werkt de waarde in de eigenschap regio en mogelijk andere eigenschappen van de nieuwe kaart regio weerspiegelen.

antwoordde op 26/02/2015 om 04:39
bron van user

stemmen
3

Hier is de SWIFT-Equivalent (Bevestigd Werken in: Xcode6.1, SDK 8.2) voor Antwoorden Mustafa's:

    func zoomToFitMapAnnotations() {
    if self.annotations.count == 0 {return}

    var topLeftCoordinate = CLLocationCoordinate2D(latitude: -90, longitude: 180)
    var bottomRightCoordinate = CLLocationCoordinate2D(latitude: 90, longitude: -180)

    var i = 1
    for object in self.annotations {
        if let annotation = object as? MKAnnotation {
            topLeftCoordinate.longitude = fmin(topLeftCoordinate.longitude, annotation.coordinate.longitude)
            topLeftCoordinate.latitude = fmin(topLeftCoordinate.latitude, annotation.coordinate.latitude)
            bottomRightCoordinate.longitude = fmin(bottomRightCoordinate.longitude, annotation.coordinate.longitude)
            bottomRightCoordinate.latitude = fmin(bottomRightCoordinate.latitude, annotation.coordinate.latitude)
        }
    }

    var center = CLLocationCoordinate2D(latitude: topLeftCoordinate.latitude - (topLeftCoordinate.latitude - bottomRightCoordinate.latitude) * 0.5, longitude: topLeftCoordinate.longitude - (topLeftCoordinate.longitude - bottomRightCoordinate.longitude) * 0.5)

    print("\ncenter:\(center.latitude) \(center.longitude)")
    // Add a little extra space on the sides
    var span = MKCoordinateSpanMake(fabs(topLeftCoordinate.latitude - bottomRightCoordinate.latitude) * 1.01, fabs(bottomRightCoordinate.longitude - topLeftCoordinate.longitude) * 1.01)
    print("\nspan:\(span.latitudeDelta) \(span.longitudeDelta)")

    var region = MKCoordinateRegion(center: center, span: span)


    region = self.regionThatFits(region)

    self.setRegion(region, animated: true)

}
antwoordde op 23/01/2015 om 11:19
bron van user

stemmen
2

Op basis van de uitstekende antwoord door me2(nu in Swift)

func coordinateRegionForCoordinates(coords: [CLLocationCoordinate2D]) -> MKCoordinateRegion {
    var rect: MKMapRect = MKMapRectNull
    for coord in coords {
        let point: MKMapPoint = MKMapPointForCoordinate(coord)
        rect = MKMapRectUnion(rect, MKMapRectMake(point.x, point.y, 0, 0))
    }
    return MKCoordinateRegionForMapRect(rect)
}
antwoordde op 18/05/2015 om 14:05
bron van user

stemmen
2
- (void)zoomToFitMapAnnotations {

if ([self.mapview.annotations count] == 0) return;

int i = 0;
MKMapPoint points`self`.`mapview`.`annotations count`;

//build array of annotation points
for (id<MKAnnotation> annotation in [self.mapview annotations])
    points[i++] = MKMapPointForCoordinate(annotation.coordinate);

MKPolygon *poly = [MKPolygon polygonWithPoints:points count:i];

[self.mapview setRegion:MKCoordinateRegionForMapRect([poly boundingMapRect]) animated:YES];
}
antwoordde op 03/12/2014 om 09:56
bron van user

stemmen
2

Een mogelijke oplossing zou kunnen zijn de afstand tussen de huidige locatie en alle annotaties en met de MKCoordinateRegionMakeWithDistance methode om een ​​gebied dat een iets grotere afstand dan de verst annotatie maken heeft.

Dit zou natuurlijk langzamer hoe meer aantekeningen die u heeft toegevoegd dat wel.

antwoordde op 26/08/2009 om 21:13
bron van user

stemmen
1

Ik weet dat dit een oude vraag, maar, als je wilt om alle annotaties al op de kaart gebruiken om deze weer te geven:

 mapView.showAnnotations(mapView.annotations, animated: true)
antwoordde op 23/12/2016 om 20:35
bron van user

stemmen
1

Toegevoegd een beetje als clausule 1 locatie- toe te voegen aan Mustufa's cound codefragment te behandelen. Gebruikt pkclSoft's zoomToAnnotation functie voor die:

if ([mapView.annotations count] == 1){
    MKCoordinateSpan span = {0.027, 0.027};
    region.span = span;
    CLLocationCoordinate2D singleCoordinate = [[mapView.annotations objectAtIndex:0] coordinate];
    region.center.latitude = singleCoordinate.latitude;
    region.center.longitude = singleCoordinate.longitude;
}
else
{
    // mustufa's code
}
antwoordde op 31/01/2012 om 05:31
bron van user

stemmen
0

Een snelle 5 versie:

   func regionFor(coordinates coords: [CLLocationCoordinate2D]) -> MKCoordinateRegion {
        var r = MKMapRect.null

        for i in 0 ..< coords.count {
            let p = MKMapPoint(coords[i])

            r = r.union(MKMapRect(x: p.x, y: p.y, width: 0, height: 0))
        }

        return MKCoordinateRegion(r)
    }
antwoordde op 28/08/2019 om 12:40
bron van user

stemmen
0

Beschouw dit extensie:

extension MKCoordinateRegion {
    init(locations: [CLLocationCoordinate2D], marginMultiplier: Double = 1.1) {
        let mapRect = locations.reduce(MKMapRect(), {
            let point = MKMapPointForCoordinate($1)
            let rect = MKMapRect(origin: point, size: MKMapSize(width: 0.0, height: 0.0))
            return MKMapRectUnion($0, rect)
        })

        var coordinateRegion = MKCoordinateRegionForMapRect(mapRect)
        coordinateRegion.span.latitudeDelta *= marginMultiplier
        coordinateRegion.span.longitudeDelta *= marginMultiplier
        self = coordinateRegion
    }
}
antwoordde op 30/09/2017 om 13:21
bron van user

stemmen
0

deze code werkt voor mij, het toont alle pinnen met de huidige locatie, hoop dat dit helpt u,

func setCenterForMap() {
    var mapRect: MKMapRect = MKMapRectNull
    for loc in mapView.annotations {
        let point: MKMapPoint = MKMapPointForCoordinate(loc.coordinate)
        print( "location is : \(loc.coordinate)");
        mapRect = MKMapRectUnion(mapRect, MKMapRectMake(point.x,point.y,0,0))
    }
    if (locationManager.location != nil) {
        let point: MKMapPoint = MKMapPointForCoordinate(locationManager.location!.coordinate)
        print( "Cur location is : \(locationManager.location!.coordinate)");
        mapRect = MKMapRectUnion(mapRect, MKMapRectMake(point.x,point.y,0,0))
    }

    mapView.setVisibleMapRect(mapRect, edgePadding: UIEdgeInsetsMake(40.0, 40.0, 40.0, 40.0), animated: true)

}
antwoordde op 08/04/2016 om 08:35
bron van user

stemmen
0

Omdat ik kan geen commentaar geven op een antwoord, wil ik graag mijn steentje gemak toe te voegen in @ me2 's antwoord (omdat ik dacht dat het was de meest elegante benadering hier Found).

Voor mijn persoonlijk project ik gewoon nog een categorie op de MKMapView klasse aan de "zichtbare gebied" functionaliteit in te kapselen voor een ver gemeenschappelijke operatie: het instellen om te kunnen alle momenteel geladen aantekeningen zien op het MKMapView instantie. het resultaat was deze:

.h file

#import <MapKit/MapKit.h>

@interface MKMapView (Extensions)

-(void)ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:(BOOL)animated;
-(void)ij_setVisibleRectToFitAnnotations:(NSArray *)annotations animated:(BOOL)animated;


@end

.m file

#import "MKMapView+Extensions.h"

@implementation MKMapView (Extensions)

/**
 *  Changes the currently visible portion of the map to a region that best fits all the currently loadded annotations on the map, and it optionally animates the change.
 *
 *  @param animated is the change should be perfomed with an animation.
 */
-(void)ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:(BOOL)animated
{
    MKMapView * mapView = self;

    NSArray * annotations = mapView.annotations;

    [self ij_setVisibleRectToFitAnnotations:annotations animated:animated];

}


/**
 *  Changes the currently visible portion of the map to a region that best fits the provided annotations array, and it optionally animates the change.
    All elements from the array must conform to the <MKAnnotation> protocol in order to fetch the coordinates to compute the visible region of the map.
 *
 *  @param annotations an array of elements conforming to the <MKAnnotation> protocol, holding the locations for which the visible portion of the map will be set.
 *  @param animated    wether or not the change should be perfomed with an animation.
 */
-(void)ij_setVisibleRectToFitAnnotations:(NSArray *)annotations animated:(BOOL)animated
{
    MKMapView * mapView = self;

    MKMapRect r = MKMapRectNull;
    for (id<MKAnnotation> a in annotations) {
        ZAssert([a conformsToProtocol:@protocol(MKAnnotation)], @"ERROR: All elements of the array MUST conform to the MKAnnotation protocol. Element (%@) did not fulfill this requirement", a);
        MKMapPoint p = MKMapPointForCoordinate(a.coordinate);
        //MKMapRectUnion performs the union between 2 rects, returning a bigger rect containing both (or just one if the other is null). here we do it for rects without a size (points)
        r = MKMapRectUnion(r, MKMapRectMake(p.x, p.y, 0, 0));
    }

    [mapView setVisibleMapRect:r animated:animated];

}

@end

Zoals je kunt zien, heb ik 2 methoden tot nu toe toegevoegd: één voor het instellen van het zichtbare gebied van de kaart om de een dat alle momenteel geladen annotaties past op de MKMapView bijvoorbeeld, en een andere methode om het instellen op een array van objecten. Dus om zichtbare gebied van de Mapview van de code zou dan net zo eenvoudig als in te stellen:

   //the mapView instance  
    [self.mapView ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:animated]; 

Ik hoop dat het helpt =)

antwoordde op 10/06/2014 om 14:16
bron van user

stemmen
0

Op basis van ME2 reactie schreef ik een categorie voor MKMapView om wat marges toe te voegen en te slaan locatie van de gebruiker annotatie:

@interface MKMapView (ZoomToFitAnnotations)
- (void)zoomToFitAnnotations:(BOOL)animated;
@end

@implementation MKMapView (ZoomToFitAnnotations)
- (void)zoomToFitAnnotations:(BOOL)animated {
    if (self.annotations.count == 0)
        return;

    MKMapRect rect = MKMapRectNull;
    for (id<MKAnnotation> annotation in self.annotations) {
        if ([annotation isKindOfClass:[MKUserLocation class]] == false) {
            MKMapPoint point = MKMapPointForCoordinate(annotation.coordinate);
            rect = MKMapRectUnion(rect, MKMapRectMake(point.x, point.y, 0, 0));
        }
    }

    MKCoordinateRegion region = MKCoordinateRegionForMapRect(rect);
    region.span.longitudeDelta *= 2; // Margin
    region.span.latitudeDelta *= 2; // Margin
    [self setRegion:region animated:animated];
}
@end
antwoordde op 15/04/2014 om 06:39
bron van user

stemmen
0
CLLocationCoordinate2D min = CLLocationCoordinate2DMake(99999.0, 99999.0);
CLLocationCoordinate2D max = CLLocationCoordinate2DMake(-99999.0, -99999.0);

// find max/min....

// zoom to cover area
// TODO: Maybe better using a MKPolygon which can calculate its own fitting region.
CLLocationCoordinate2D center = CLLocationCoordinate2DMake((max.latitude + min.latitude) / 2.0, (max.longitude + min.longitude) / 2.0);
MKCoordinateSpan span = MKCoordinateSpanMake(max.latitude - min.latitude, max.longitude - min.longitude);
MKCoordinateRegion region = MKCoordinateRegionMake(center, span);

[_mapView setRegion:[_mapView regionThatFits:region] animated:YES];
antwoordde op 27/07/2012 om 13:08
bron van user

stemmen
0

Ik hoop dat dit op zijn minst relevant, dit is wat ik in elkaar gezet voor Mono (gebaseerd off van antwoord pkclSoft's):

void ZoomMap (MKMapView map)
{
    var annotations = map.Annotations;

    if (annotations == null || annotations.Length == 0) 
        return;

    var points = annotations.OfType<MapAnnotation> ()
                            .Select (s => MKMapPoint.FromCoordinate (s.Coordinate))
                            .ToArray ();            

    map.SetVisibleMapRect(MKPolygon.FromPoints (points).BoundingMapRect, true); 
}
antwoordde op 06/03/2012 om 07:13
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more