Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS set MKMapView center so supplied location is in the bottom center

Tags:

ios

mkmapview

I have a MKMapView and a never changing CLLocationCoordinate2D. What I am trying to do is center the map so that this coordinate will be placed at the bottom center of the map. I am able to center the map on this coordinate with the simple:

MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(mapCenter, 10000, 10000);
[self.mapView setRegion:viewRegion animated:YES];

But how can I make it so that the map centers on the point that would make this mapCenter coordinate be placed at the bottom of the map? I would like it to work regardless of the initial zoom level of the map if possible.

like image 777
shiznatix Avatar asked Dec 19 '22 18:12

shiznatix


2 Answers

I wrote you a quick method that should do the trick...

After getting a MKCoordinateRegion with the location coordinate centered, you can create a new CLLocationCoordinate2D center point by adding a fraction of that region's latitudinal span (in this case, a fourth). Create a new coordinate region using the new center point and the old region's span, set it as the region of the MKMapView, and you're good to go.

P.s. - If you want the location centered all the way at the bottom, create the new CLLocationCoordinate2D center point by adding half of the region's latitudinal span (instead of a fourth).

-(void)setLocation:(CLLocationCoordinate2D)location inBottomCenterOfMapView:(MKMapView*)mapView
{
    //Get the region (with the location centered) and the center point of that region
    MKCoordinateRegion oldRegion = [mapView regionThatFits:MKCoordinateRegionMakeWithDistance(location, 800, 800)];
    CLLocationCoordinate2D centerPointOfOldRegion = oldRegion.center;

    //Create a new center point (I added a quarter of oldRegion's latitudinal span)
    CLLocationCoordinate2D centerPointOfNewRegion = CLLocationCoordinate2DMake(centerPointOfOldRegion.latitude + oldRegion.span.latitudeDelta/4.0, centerPointOfOldRegion.longitude);

    //Create a new region with the new center point (same span as oldRegion)
    MKCoordinateRegion newRegion = MKCoordinateRegionMake(centerPointOfNewRegion, oldRegion.span);

    //Set the mapView's region
    [worldView setRegion:newRegion animated:YES];
}

Here's what you'd get with the method above.

like image 122
Matthew Avatar answered Dec 29 '22 00:12

Matthew


Great jop Matthew! Thanks!

Here the same solution in SWIFT 3:

func setLocation(location: CLLocationCoordinate2D, inBottomCenterOfMapView: MKMapView) {
    let oldRegion = mapView.regionThatFits(MKCoordinateRegionMakeWithDistance(location, 800, 800))
    let centerPointOfOldRegion = oldRegion.center
    let centerPointOfNewRegion = CLLocationCoordinate2DMake(centerPointOfOldRegion.latitude + oldRegion.span.latitudeDelta/4.0, centerPointOfOldRegion.longitude)
    let newRegion = MKCoordinateRegionMake(centerPointOfNewRegion, oldRegion.span)
    worldView.setRegion(newRegion, animated: true)
}
like image 35
Blank Avatar answered Dec 28 '22 22:12

Blank