Zoom in a MKMapView programmatically

42,652

Solution 1

I have no idea if this is the right way to do it, but I'm using this to zoom in and out.

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

Solution 2

Just cleaning up dkdarel's answer

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

Solution 3

Here is an easier solution:

MKUserLocation *userLocation = mapView.userLocation;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
      userLocation.location.coordinate, 50, 50);
[mapView setRegion:region animated:NO];

Solution 4

mapView.setRegion method has problem when your map is rotated

You can zoom map via mapView.camera.altitude property, but it is not animated:

mapView.camera.altitude *= 1.05

You can create new camera object and set it with animation:

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)

Solution 5

Here is my way to move map to the annotation point and zoom pretty close to it. You can easily change the zoom in line CGFloat 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];
}
Share:
42,652

Related videos on Youtube

Hectoret
Author by

Hectoret

Updated on July 09, 2022

Comments

  • Hectoret
    Hectoret almost 2 years

    I'm using a MKMapView inside an iPhone app. When I click a button the zoom level must increase. This is my first approach:

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

    However, this code had no effect, since I didn't update the longitudeDelta value. So I added this line:

    zoomIn.span.longitudeDelta *= 0.5;
    

    Now it works, but only sometimes. The latitudeDelta and longitudeDelta don't change in the same way, I mean, their values are not proportional. Any idea how to solve this?

  • user366584
    user366584 over 12 years
    It helps me aswell, Thanks bro
  • Vivek Shah
    Vivek Shah about 9 years
    this works fine ,but when I continually press the zoom out button it give me exception after some level. How can I prevent it ?
  • Tapas Pal
    Tapas Pal almost 9 years
    That's exactly i was looking for.. Thanx bro
  • dustinrwh
    dustinrwh over 8 years
    Cool. What is the point of dividing by 2.0002 rather than 2? Just curious :)
  • Sanju
    Sanju about 8 years
    hee Zoom -Out Code is crashing when i pressed continuously , can you tell me how to fix ?? here is the Crash Log: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid Region <center:+13.06748979, +80.24493745 span:+245.43019431, +223.01760747>'
  • Simon Moshenko
    Simon Moshenko almost 7 years
    I think this would be a correct swift code func zoomRegion( region: inout MKCoordinateRegion, byFactor delta: Double) { var span: MKCoordinateSpan = region.span span.latitudeDelta *= delta span.longitudeDelta *= delta region.span = span }