I have an issue. My current location is displayed and centered in a map view however the map region doesn't get zoomed in to. I tried taking Rob's advice by taking span and region out of the didUpdateToLocation method but I must not have implemented it right. I don't think it's recognizing my call to setRegion in viewDidLoad and my buttons aren't being recognized. Please check my code below and point out the mistake(s). My goal is to be able to zoom in and out of my location using the IBAction buttons.
.h
- (IBAction)zoomIn:(id)sender;
- (IBAction)zoomOut:(id)sender;
.m in viewDidLoad
double miles = 0.5;
MKCoordinateSpan span;
span.latitudeDelta = miles/69.0;
span.longitudeDelta = miles/69.0;
MKCoordinateRegion region;
region.span = span;
[self.mapView setRegion:region animated:YES];
[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
_mapView.mapType = MKMapTypeSatellite;
.m in my didUpdateToLocation method.
[self.mapView setCenterCoordinate:newLocation.coordinate animated:YES];
.Zoom In:
- (IBAction)zoomIn:(id)sender
{
MKCoordinateSpan span;
span.latitudeDelta = _mapView.region.span.latitudeDelta * 2;
span.longitudeDelta = _mapView.region.span.latitudeDelta * 2;
MKCoordinateRegion region;
region.span = span;
region.center = _mapView.region.center;
[self.mapView setRegion:region animated:YES];
}
.Zoom Out :
- (IBAction)zoomOut:(id)sender
{
MKCoordinateSpan span;
span.latitudeDelta = _mapView.region.span.latitudeDelta / 2;
span.longitudeDelta = _mapView.region.span.latitudeDelta / 2;
MKCoordinateRegion region;
region.span = span;
region.center = _mapView.region.center;
[self.mapView setRegion:region animated:YES];
}
Swift 3:
You could achieve the most basic in 3 lines of code
OK, this is what I ended using to get my 2 IBAction buttons (zoomIn and zoomOut) to work with my mapView. When you open the app, the user location is displayed and the map zooms in and centers around it. You can then use the buttons to zoom in or zoom out by a factor of 2. *Big thanks to Rob who showed me the way.
.h
.m
I have a couple other calls to MKMapView like self.mapView.showsUserLocation = YES; in viewDidLoad but that's pretty much it.
Try this. But I haven't tested yet.
Swift 2.0:
Using Extension :
Usage:
You can get the current
region
, multiply or divide thespan
by two, as appropriate (dividing on zoom in, multiplying on zoom out), and then set theregion
:If you want to have the map automatically zoom to your location, you can use:
If you want to do this manually, you can do something like the following. First, define an class property for whether you've zoomed in already or not:
then change your
didUpdateLocations
(ordidUpdateToLocation
) to check this and set the zoom scale once:This basically says, "if I haven't zoomed in yet, set the region based upon the
newLocation
and a certain number of meters around that location, but if I have already done that, the just set the center coordinate based upon my current location, but don't change the zoom scale (in case I already zoomed in or out). This also does some conditional iOS version number logic (using the macros shown here), making sure if the end-user is running iOS prior to 6.0, that it will call our updated method.By the way, if you're showing the user location on the map (e.g.
self.mapView.showsUserLocation = YES;
), you might want to have thisdidUpdateLocations
also remove the overlay associated with theMKUserLocation
before moving the map center, otherwise it can leave the old overlay sitting around: