user1007522
user1007522

Reputation: 8118

Zoom in to current location on map

I want to show the current location of the user on the map and zoom on to it.

I tried as follows:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        NSLog(@"Init MapViewController");
        [self initMap];
    }
    return self;
}


-(void) initMap
{
    _mapView = [[MKMapView alloc] initWithFrame:self.view.frame];

    _mapView.delegate = self;
    _mapView.showsUserLocation = YES;

    [self.view addSubview:_mapView];

    CLLocationCoordinate2D currentLocation;
    currentLocation.latitude = _mapView.userLocation.coordinate.latitude;
    currentLocation.longitude= _mapView.userLocation.coordinate.longitude;

    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(currentLocation, 0.5*METERS_PER_MILE, 0.5*METERS_PER_MILE);

    [_mapView setRegion:viewRegion animated:YES];
}

Then in the simulator it shows a location in the sea. I set the location to London in the simulator.

Upvotes: 0

Views: 558

Answers (2)

BHASKAR
BHASKAR

Reputation: 1201

Just do This:

@property  (strong, nonatomic)   CLLocationManager *locationManager;

In viewdidload:

self.locationManager = [[CLLocationManager alloc] init] ;
self.locationManager.delegate = (id)self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation ;
[self.locationManager setDistanceFilter:10.0f] ;
[self.locationManager startUpdatingLocation];

And in your location manager

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation
{
    [self.locationManager stopUpdatingLocation];
    CLLocationCoordinate2D zoomLocation;
    zoomLocation.latitude = YourMapView.userLocation.location.coordinate.latitude;
    zoomLocation.longitude= YourMapView.userLocation.location.coordinate.longitude;
    // 2
    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 0.5*1609.344, 0.5*1609.344);
    // 3
    [YourMapView setRegion:viewRegion animated:YES];
}

Upvotes: 2

user1007522
user1007522

Reputation: 8118

I needed to listen to changes for the user location. Because in the view didload the location isn't known.

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    MKCoordinateRegion region;
    region.center = self.mapView.userLocation.coordinate;

    MKCoordinateSpan span;
    span.latitudeDelta  = 1; // Change these values to change the zoom
    span.longitudeDelta = 1;
    region.span = span;

    [self.mapView setRegion:region animated:YES];
}

and this in the viewdidload:

[self.mapView.userLocation addObserver:self
                            forKeyPath:@"location"
                               options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
                               context:nil];

Upvotes: 0

Related Questions