Zoom in een MKMapView programmatisch

stemmen
23

Ik gebruik een MKMapViewin een iPhone app. Wanneer ik klik op een knop het zoomniveau moet toenemen. Dit is mijn eerste benadering:

MKCoordinateRegion zoomIn = mapView.region;
zoomIn.span.latitudeDelta *= 0.5;
[mapView setRegion:zoomIn animated:YES];

Echter, deze code had geen effect, omdat ik niet de longitudeDelta waarde heeft bijgewerkt. Dus voegde ik deze lijn:

zoomIn.span.longitudeDelta *= 0.5;

Nu het werkt, maar slechts af en toe. De latitudeDeltaen longitudeDeltaveranderen niet op dezelfde manier, ik bedoel, hun waarden zijn niet evenredig. Enig idee hoe dit op te lossen?

De vraag is gesteld op 23/06/2009 om 11:37
bron van user
In andere talen...                            


9 antwoorden

stemmen
27

Ik heb geen idee of dit de juiste manier om het te doen, maar ik gebruik deze om in en uit te zoomen.

        case 0: { // Zoom In
        //NSLog(@"Zoom - IN");
        MKCoordinateRegion region;
        //Set Zoom level using Span
        MKCoordinateSpan span;  
        region.center=mapView.region.center;

        span.latitudeDelta=mapView.region.span.latitudeDelta /2.0002;
        span.longitudeDelta=mapView.region.span.longitudeDelta /2.0002;
        region.span=span;
        [mapView setRegion:region animated:TRUE];
    }
        break;

    // Zoom Out 
    case 2: {
        //NSLog(@"Zoom - OUT");
        MKCoordinateRegion region;
        //Set Zoom level using Span
        MKCoordinateSpan span;  
        region.center=mapView.region.center;
        span.latitudeDelta=mapView.region.span.latitudeDelta *2;
        span.longitudeDelta=mapView.region.span.longitudeDelta *2;
        region.span=span;
        [mapView setRegion:region animated:TRUE];
    }
antwoordde op 29/07/2009 om 14:58
bron van user

stemmen
21

Gewoon opruimen antwoord dkdarel's

// delta is the zoom factor
// 2 will zoom out x2
// .5 will zoom in by x2
- (void)zoomMap:(MKMapView*)mapView byDelta:(float) delta {

    MKCoordinateRegion region = mapView.region;
    MKCoordinateSpan span = mapView.region.span;
    span.latitudeDelta*=delta;
    span.longitudeDelta*=delta;
    region.span=span;
    [mapView setRegion:region animated:YES];

}

Swift code:

func zoomMap(byFactor delta: Double) {
    var region: MKCoordinateRegion = self.mapView.region
    var span: MKCoordinateSpan = mapView.region.span
    span.latitudeDelta *= delta
    span.longitudeDelta *= delta
    region.span = span
    mapView.setRegion(region, animated: true)
}
antwoordde op 21/11/2013 om 19:43
bron van user

stemmen
21

Hier is een eenvoudiger oplossing:

MKUserLocation *userLocation = mapView.userLocation;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
      userLocation.location.coordinate, 50, 50);
[mapView setRegion:region animated:NO];
antwoordde op 28/11/2012 om 18:40
bron van user

stemmen
2

Net vertaald oplossing dkardel om swift:

@IBAction func zoomOutButtonClicked(sender: UIButton) {
    let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta*2, longitudeDelta: mapView.region.span.longitudeDelta*2)
    let region = MKCoordinateRegion(center: mapView.region.center, span: span)

    mapView.setRegion(region, animated: true)
}

@IBAction func zoomInButtonClicked(sender: UIButton) {
    let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta/2, longitudeDelta: mapView.region.span.longitudeDelta/2)
    let region = MKCoordinateRegion(center: mapView.region.center, span: span)

    mapView.setRegion(region, animated: true)
}
antwoordde op 31/03/2015 om 08:43
bron van user

stemmen
2

Hier is mijn manier om de kaart om de annotatie punt te verplaatsen en zoom redelijk dicht bij het. U kunt gemakkelijk veranderen in de lijn van de zoomCGFloat newLatDelta = 0.06f;

- (void)moveMapToAnnotation:(MKPointAnnotation*)annotation
{
    CGFloat fractionLatLon = map.region.span.latitudeDelta / map.region.span.longitudeDelta;
    CGFloat newLatDelta = 0.06f;
    CGFloat newLonDelta = newLatDelta * fractionLatLon;
    MKCoordinateRegion region = MKCoordinateRegionMake(annotation.coordinate, MKCoordinateSpanMake(newLatDelta, newLonDelta));
    [map setRegion:region animated:YES];
}
antwoordde op 01/04/2014 om 11:57
bron van user

stemmen
1

mapView.setRegion methode heeft een probleem wanneer uw kaart wordt gedraaid

Je kunt inzoomen kaart via mapView.camera.altitudeonroerend goed, maar het is niet geanimeerd:

mapView.camera.altitude *= 1.05

U kunt nieuwe camera object te maken en zet deze met animatie:

let currentCamera = mapView.camera
let newCamera: MKMapCamera
if #available(iOS 9.0, *) {
    newCamera = MKMapCamera(lookingAtCenter: currentCamera.centerCoordinate, fromDistance: currentCamera.altitude * 2, pitch: currentCamera.pitch, heading: currentCamera.heading)
} else {
    newCamera = MKMapCamera()
    newCamera.centerCoordinate = currentCamera.centerCoordinate
    newCamera.heading = currentCamera.heading
    newCamera.altitude = currentCamera.altitude * 2
    newCamera.pitch = currentCamera.pitch
}

mapView.setCamera(newCamera, animated: true)
antwoordde op 17/05/2017 om 12:33
bron van user

stemmen
1
- (IBAction)btnZoomInPressed
{
    MKCoordinateRegion region;
    MKCoordinateSpan span;
    region.center.latitude = lati;
    region.center.longitude = longi;
    span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta /2.0002;
    span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta /2.0002;
    region.span=span;
    [viewMapSingleVenue setRegion:region animated:TRUE];
}

- (IBAction)btnZoomOutPressed
{
    MKCoordinateRegion region;
    MKCoordinateSpan span;
    region.center.latitude = lati;
    region.center.longitude = longi;
    span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta *2;
    span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta *2;
    if(span.latitudeDelta < 200)
    {
    region.span=span;
    [viewMapSingleVenue setRegion:region animated:TRUE];
    }
}
antwoordde op 20/02/2015 om 13:56
bron van user

stemmen
1

Ik gebruik vergelijkbaar code met de jouwe en het lijkt te werken. Wat kan gebeuren is dat uw delta niet aan het veranderen is genoeg om ervoor te zorgen het zoomniveau te verhogen van het ene google zoomniveau naar de volgende. Dit zou ook afhangen van de oorspronkelijke staat van de kaart, die zou kunnen verklaren waarom het intermitterend - dus hoe zet je de kaart en het zoomniveau up te beginnen, voordat de gebruiker de zoomknop drukt?

U kunt ook kijken naar de regionThatFits methode die de regio die u verstrekt (naam is uit het geheugen als ik niet de appel docs hand hebt) zal aanpassen.

antwoordde op 23/06/2009 om 13:16
bron van user

stemmen
0

In Swift 4.2

let location = mapView.userLocation
let region = MKCoordinateRegion(center: location.coordinate, span: MKCoordinateSpan(latitudeDelta: 50, longitudeDelta: 50))
mapView.setRegion(region, animated: true)
antwoordde op 22/03/2019 om 12:02
bron van user

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