195 votes

Zoom MKMapView pour s'adapter à l'annotation des épingles?

Je suis à l'aide de MKMapView et ont ajouté un certain nombre d'annotations broches de la carte de 5 à 10 kilomètres de la zone. Quand je lance l'application ma carte commence zoom arrière pour montrer au monde entier, quelle est la meilleure façon de zoom de la carte, donc les broches à l'ajustement de la vue?

EDIT: Ma première pensée serait d'utiliser MKCoordinateRegionMake et calculer les coordonnées du centre, longitudeDelta et latitudeDelta de mes annotations. Je suis sûr que cela va fonctionner, mais je voulais juste vérifier que je n'étais pas manque rien d'évident.

Code ajouté, BTW: FGLocation est une classe qui est conforme à l' MKAnnotation, locationFake est un NSMutableArray de ces objets. Commentaires toujours les bienvenus ....

- (MKCoordinateRegion)regionFromLocations {
    CLLocationCoordinate2D upper = [[locationFake objectAtIndex:0] coordinate];
    CLLocationCoordinate2D lower = [[locationFake objectAtIndex:0] coordinate];

    // FIND LIMITS
    for(FGLocation *eachLocation in locationFake) {
        if([eachLocation coordinate].latitude > upper.latitude) upper.latitude = [eachLocation coordinate].latitude;
        if([eachLocation coordinate].latitude < lower.latitude) lower.latitude = [eachLocation coordinate].latitude;
        if([eachLocation coordinate].longitude > upper.longitude) upper.longitude = [eachLocation coordinate].longitude;
        if([eachLocation coordinate].longitude < lower.longitude) lower.longitude = [eachLocation coordinate].longitude;
    }

    // FIND REGION
    MKCoordinateSpan locationSpan;
    locationSpan.latitudeDelta = upper.latitude - lower.latitude;
    locationSpan.longitudeDelta = upper.longitude - lower.longitude;
    CLLocationCoordinate2D locationCenter;
    locationCenter.latitude = (upper.latitude + lower.latitude) / 2;
    locationCenter.longitude = (upper.longitude + lower.longitude) / 2;

    MKCoordinateRegion region = MKCoordinateRegionMake(locationCenter, locationSpan);
    return region;
}

336voto

jowie Points 3733

C'est le seul que j'ai trouvé ici ce qui a fonctionné pour moi:

(EDIT: j'ai mis à jour la solution à l'aide de @Michée est une suggestion d'augmenter la pointRect de 0,1 à assurer le rectangle n'est pas infime!)

MKMapRect zoomRect = MKMapRectNull;
for (id <MKAnnotation> annotation in mapView.annotations)
{
    MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
    MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
    zoomRect = MKMapRectUnion(zoomRect, pointRect);
}
[mapView setVisibleMapRect:zoomRect animated:YES];

 

Vous pouvez également mise à jour afin d'inclure les userLocation pin par le remplacement de la première ligne avec:

MKMapPoint annotationPoint = MKMapPointForCoordinate(mapView.userLocation.coordinate);
MKMapRect zoomRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);

124voto

Matthew Frederick Points 14932

Vous avez vu juste. Trouvez votre maximum et minimum des latitudes et longitudes, appliquez un peu de l'arithmétique simple, et l'utilisation MKCoordinateRegionMake.

122voto

Ryan Berg Points 566

Apple a ajouté une nouvelle méthode pour IOS 7 pour simplifier un peu la vie.

[mapView showAnnotations:yourAnnotationArray animated:YES];

Vous pouvez facilement tirer à partir d'un tableau stocké dans la vue de la carte:

yourAnnotationArray = mapView.annotations;

et d'ajuster rapidement l'appareil photo aussi!

mapView.camera.altitude *= 1.4;

cela ne fonctionnera pas à moins que l'utilisateur a iOS 7+ ou OS X 10.9+ installé. découvrez personnaliser l'animation ici

42voto

Rafael Moreira Points 1041

J'ai utiliser ce code et fonctionne très bien pour moi:

-(void)zoomToFitMapAnnotations:(MKMapView*)aMapView
{
    if([aMapView.annotations count] == 0)
        return;

    CLLocationCoordinate2D topLeftCoord;
    topLeftCoord.latitude = -90;
    topLeftCoord.longitude = 180;

    CLLocationCoordinate2D bottomRightCoord;
    bottomRightCoord.latitude = 90;
    bottomRightCoord.longitude = -180;

    for(MapViewAnnotation *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;
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1; // Add a little extra space on the sides
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; // Add a little extra space on the sides

    region = [aMapView regionThatFits:region];
    [mapView setRegion:region animated:YES];
}

13voto

Micah Points 121

@jowie la solution fonctionne très bien. Un hic, si une carte a une seule annotation, vous vous retrouverez avec un zoom de la carte. J'ai ajouté 0,1 à le rect faire de taille pour s'assurer setVisibleMapRect a quelque chose à zoomer.

MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X