Reputation: 111
I seem to have the opposite problem from many of those posted here about MKMapView
. Rather than not being able to get it to zoom to and display the current location, I can't seem to get it to stop doing so. Here's what happens:
I've tried telling my CLLocationManager
to stopUpdatingLocation
(no effect, since an MKMapView
knows how to use CoreLocation
), and I've tried telling the MKMapView
to setShowsUserLocation:NO
(no blue dot displayed at all, which is not what I want). I even tried eliminating my CLLocationManager
(no effect). What is causing this and how do I stop it?
Yes, I do set the location manager's accuracy and distance in -loadView
.
I don't implement -mapViewDidFinishLoadingMap
:. Here is my implementation of
-locationManager:didUpdateToLocation:fromLocation:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// How many seconds ago was this new location created?
NSTimeInterval t = [[newLocation timestamp] timeIntervalSinceNow];
// CLLocationManagers will return the last found location of the device first,
// you don't want that data in this case. If this location was made more than 3
// minutes ago, ignore it.
if (t < -180)
{
// This is cached data, you don't want it, keep looking
return;
}
[locationManager stopUpdatingLocation];
}
I think this is the centering you're asking about, @Anna Karenina:
- (void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)u
{
CLLocationCoordinate2D loc = [u coordinate];
// Display the region 500 meters square around the current location
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, 500, 500);
[mv setRegion:region animated:YES];
}
Upvotes: 11
Views: 4374
Reputation: 239
I use dispatch_once in MKMapViewDelegate method to zoom only once at the beginning. Here is the code.
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
CLLocationCoordinate2D newCoordinate = CLLocationCoordinate2DMake(mapView.userLocation.coordinate.latitude, mapView.userLocation.coordinate.longitude);
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newCoordinate, 500, 500);
[mapView setRegion:region animated:YES];
});
}
Upvotes: 0
Reputation: 41
Dont implement - (void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)u
method.
Instead use locationmanager didUpdateToLocation
.
didUpdateUserLocation
is called multiple times without any reason.where didUpdateToLocation
is called when any location changes occurred.
Then u can manually set the mkmapview region in the didUpdateToLocation
method.
Upvotes: 4
Reputation: 52798
First, and I dont know that this will effect things much, but do you set your location managers accuracy and distance filter at all in viewDidLoad
(or wherever you are implementing your locationManager):
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDistanceFilter:kCLDistanceFilterNone];
Second, check these 2 functions in your source (ignore the content of the actual functions I have listed here, it is just for illustration and to show usage) and if possible, provide your code for these functions so we can better assist:
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
[activityIndicator stopAnimating];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSDate* eventDate = newLocation.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (abs(howRecent) < 15.0)
{
NSLog(@"New Latitude %+.6f, Longitude %+.6f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
}
}
Upvotes: 0