Pozycjonowanie MKMapView pokazać kilka adnotacji naraz

głosy
89

Mam kilka adnotacje chcę dodać do mojego MKMapView (to mogło pozycji 0-n, gdzie n jest zwykle około 5). Mogę dodać adnotacje w porządku, ale chcę zmienić rozmiar mapy, aby zmieścić wszystkie adnotacje na ekranie na raz, i nie jestem pewien, jak to zrobić.

Szukałem na -regionThatFits:ale nie jestem pewien, co z nim zrobić. Wyślę jakiś kod, aby pokazać, co mam do tej pory. Myślę, że to powinno być proste zadanie, ale ogólnie czuję się nieco przytłoczony MapKit tak daleko.

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

Wskazówka, to wszystko dzieje się jak otrzymać aktualizację lokalizacji ... Nie wiem, czy to odpowiednie miejsce, aby to zrobić. Jeśli nie, to gdzie byłby lepszym miejscem? -viewDidLoad?

Z góry dziękuję.

Utwórz 26/08/2009 o 18:35
źródło użytkownik
W innych językach...                            


23 odpowiedzi

głosy
133

Link wysłane przez Jima jest teraz martwy, ale udało mi się znaleźć kod (który miałem gdzieś w zakładkach). Mam nadzieję że to pomoże.

- (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]; 
}
Odpowiedział 26/08/2011 o 07:22
źródło użytkownik

głosy
132

Dlaczego tak skomplikowane?

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);
}
Odpowiedział 08/08/2012 o 11:41
źródło użytkownik

głosy
43

Zrobiłem coś podobnego do tego, aby pomniejszyć (lub) na obszarze, który zawierał adnotację punktową i aktualną lokalizację. Można rozszerzyć ten poprzez zapętlenie poprzez adnotacji.

Podstawowe kroki są następujące:

  • Oblicz min ac / długie
  • Oblicz maksymalna długość / szerokość geograficzna
  • Tworzenie obiektów CLLocation dla tych dwóch punktów
  • Obliczanie odległości pomiędzy punktami
  • Tworzenie obszaru stosując punkt środkowy pomiędzy punktami i odległości przeliczeniu na stopnie
  • Przechodzą region w MapView dostosować
  • Użyj regionu skorygowanej ustawić obszar MapView
    -(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];
    }
Odpowiedział 27/08/2009 o 20:56
źródło użytkownik

głosy
36

Począwszy od iOS7 można użyć showAnnotations: animowane:

[mapView showAnnotations:annotations animated:YES];
Odpowiedział 22/03/2014 o 02:27
źródło użytkownik

głosy
21

Mam inną odpowiedź. Miałem zamiar zrobić wdrożenia algorytmu Zoom-to-fit siebie, ale pomyślałem, że Apple musi mieć sposób, aby robić to, co chcieliśmy, nie tak dużo pracy. Korzystanie z API doco szybko pokazał, że mogę używać MKPolygon robić to, co było potrzebne:

/* 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];
}

Mam nadzieję że to pomoże.

Odpowiedział 04/10/2011 o 02:50
źródło użytkownik

głosy
14

można też zrobić to w ten sposób ..

// 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;
}
Odpowiedział 12/09/2011 o 05:59
źródło użytkownik

głosy
12

Na podstawie informacji i sugestii od wszystkich wymyśliłem poniżej. Dzięki dla wszystkich w tej dyskusji o przyczynianie :) To pójdzie w kontroler widoku, który zawiera MapView.

- (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]; 
}
Odpowiedział 20/10/2011 o 21:00
źródło użytkownik

głosy
5

W moim przypadku, ja rozpoczynam z obiektami CLLocation i tworzenia adnotacji dla każdego z nich.
I wystarczy umieścić dwie adnotacje, więc mam proste podejście do budowania tablicę punktów, ale może być łatwo rozbudowany zbudować tablicę z dowolnej długości danego zestawu CLLocations.

Oto moja implementacja (nie wymaga tworzenia 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])];
Odpowiedział 25/01/2012 o 21:11
źródło użytkownik

głosy
4

Korzystanie SWIFT, wielokąt, i trochę zaokrąglona użyłem następujących czynności:

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)
}

Odpowiedział 06/04/2015 o 15:46
źródło użytkownik

głosy
3

Jest to nowa metoda in „MKMapView” jak iOS 7, który można użyć

Deklaracja

SZYBKI

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

CEL C

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

parametry

adnotacje adnotacje, które mają być widoczne na mapie. animowane TAK jeśli chcesz zmiana map region być animowane, lub NIE, jeśli chcesz, aby natychmiast wyświetlić mapę nowy obszar bez animacji.

Dyskusja

Wywołanie tej metody aktualizuje wartość nieruchomości w regionie i potencjalnie inne właściwości, aby odzwierciedlić nowy obszar mapy.

Odpowiedział 26/02/2015 o 04:39
źródło użytkownik

głosy
3

Oto Equivalent SWIFT (potwierdzone Praca w: Xcode6.1 SDK 8.2) odpowiedzi Mustafa:

    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)

}
Odpowiedział 23/01/2015 o 11:19
źródło użytkownik

głosy
2

W oparciu o doskonałą odpowiedź przez me2(obecnie w 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)
}
Odpowiedział 18/05/2015 o 14:05
źródło użytkownik

głosy
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];
}
Odpowiedział 03/12/2014 o 09:56
źródło użytkownik

głosy
2

Jednym z możliwych rozwiązań może być pomiar odległości między bieżącej lokalizacji i wszystkich adnotacji i przy użyciu metody MKCoordinateRegionMakeWithDistance aby region, który ma nieco większą odległość niż najdalszym adnotacji.

To oczywiście się wolniej więcej adnotacji dodanych chociaż.

Odpowiedział 26/08/2009 o 21:13
źródło użytkownik

głosy
1

Wiem, że jest to stara sprawa, ale jeśli chcesz wyświetlić wszystkie adnotacje już na mapie, użyj tego:

 mapView.showAnnotations(mapView.annotations, animated: true)
Odpowiedział 23/12/2016 o 20:35
źródło użytkownik

głosy
1

Dodano trochę jeśli klauzula obsłużyć 1 lokalizacja-do dodania kodu cound fragmencie mustufa użytkownika. Używane funkcję zoomToAnnotation pkclSoft za które:

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
}
Odpowiedział 31/01/2012 o 05:31
źródło użytkownik

głosy
0

Szybka 5 wersja:

   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)
    }
Odpowiedział 28/08/2019 o 12:40
źródło użytkownik

głosy
0

Rozważmy to rozszerzenie:

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
    }
}
Odpowiedział 30/09/2017 o 13:21
źródło użytkownik

głosy
0

Ten kod działa dla mnie, to pokazuje wszystkie szpilki z bieżącej lokalizacji nadzieję, że to pomaga,

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)

}
Odpowiedział 08/04/2016 o 08:35
źródło użytkownik

głosy
0

Ponieważ nie mogę wypowiedzieć się na odpowiedź, chciałbym dodać moje trochę wygody w @ „s ME2 odpowiedzi (ponieważ myślałem, że to najbardziej elegancki podejście znaleźć tutaj).

Dla mojego osobistego projektu po prostu dodaje kategorię od klasy MKMapView do hermetyzacji „widocznego obszaru” funkcjonalność dla ver wspólnego działania: ustawienie, aby móc zobaczyć wszystkie aktualnie załadowane adnotacje na przykład MKMapView. wynik był następujący:

plik .h

#import <MapKit/MapKit.h>

@interface MKMapView (Extensions)

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


@end

.m pliku

#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

Jak widać, Dodałem 2 metody do tej pory: jedno do ustawiania widzialnym obszarze mapie, aby ten, który pasuje do wszystkich aktualnie załadowanych adnotacje na przykład MKMapView i innej metody, aby ustawić go w dowolnym tablicę obiektów. Tak, aby ustawić Region MapView widoczny jest kod będzie wówczas tak proste, jak:

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

Mam nadzieję, że to pomaga =)

Odpowiedział 10/06/2014 o 14:16
źródło użytkownik

głosy
0

Na podstawie odpowiedzi ME2 pisałem kategorię dla MKMapView dodać jakieś marginesy i pominąć lokalizacji użytkownika adnotacji:

@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
Odpowiedział 15/04/2014 o 06:39
źródło użytkownik

głosy
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];
Odpowiedział 27/07/2012 o 13:08
źródło użytkownik

głosy
0

Mam nadzieję, że jest to co najmniej istotne, jest to, co zebrała dla Mono (w oparciu off odpowiedzi pkclSoft użytkownika):

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); 
}
Odpowiedział 06/03/2012 o 07:13
źródło użytkownik

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