防止MKMapView不断重新缩放并重新定位到用户位置

时间:2011-09-23 02:08:46

标签: iphone location mkmapview zooming

我似乎遇到了许多与MKMapView相关的问题。我似乎无法让它停止这样做,而不是无法让它缩放并显示当前位置。这是发生的事情:

  • 我启动了应用
  • MKMapView以蓝点显示我的位置
  • 我用手指缩小并远离地图
  • 几秒钟后,MKMapView突然缩小,重新回到我当前位置的中心位置

我尝试告诉我的CLLocationManager stopUpdatingLocation(没有效果,因为MKMapView知道如何使用CoreLocation),我试过告诉{ {1}}到MKMapView(根本没有显示蓝点,这不是我想要的)。我甚至试图消除我的setShowsUserLocation:NO(没有效果)。造成这种情况的原因是什么?如何阻止它?


是的,我确实在CLLocationManager设置了位置管理员的准确度和距离。

我没有实施-loadView:这是我的

实现
-mapViewDidFinishLoadingMap

我认为这是你要问的中心,@ Anna Karenina:

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

3 个答案:

答案 0 :(得分:4)

不要实施- (void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)u方法。

而是使用locationmanager didUpdateToLocation

无需任何理由多次调用

didUpdateUserLocation。当发生任何位置更改时,会调用didUpdateToLocation

然后你可以在didUpdateToLocation方法中手动设置mkmapview区域。

答案 1 :(得分:0)

首先,我不知道这会对事情产生多大影响,但您是否在viewDidLoad(或您实施locationManager的任何地方)设置了位置管理员的准确度和距离过滤器:

[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDistanceFilter:kCLDistanceFilterNone];

其次,检查源中的这两个函数(忽略我在此处列出的实际函数的内容,它仅用于说明和显示用法),如果可能,请提供您的代码这些功能让我们可以更好地协助:

- (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);
    }
}

答案 2 :(得分:0)

我在MKMapViewDelegate方法中使用dispatch_once在开头只缩放一次。这是代码。

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