如何防止mapview被更新

时间:2011-12-08 01:18:36

标签: iphone ios mkmapview

我对iPhone的编程很陌生,但我在其中制作了一个只有MKMapView的应用程序。 我让它放大到我的位置但我不断更新位置。我的观点是,我希望它停止自动定位我,它仍然可以继续,但我只想让它停止定位。当我向任何方向滑动时,它会迫使我回到我的位置,或者当我散步并更新位置时。我的想法是,我希望应用程序能够使用一些注释。

一些代码

- (void) mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    NSLog(@"Found your location!");
    MKCoordinateRegion mapregion;
    map.showsUserLocation = YES;
    mapregion.center.latitude = map.userLocation.coordinate.latitude;
    mapregion.center.longitude = map.userLocation.coordinate.longitude;
    mapregion.span = MKCoordinateSpanMake(0.005,0.005);
    [map setRegion:mapregion animated:YES];
    map.userLocation.title = @"You're here";
    // map.mapType =  MKUserTrackingModeNone;

    // (found this on apple developer site, I think this can 
    // help but I have no clue at all //someone know what you can use this for?)
}

// In case you have the flightmode on...
- (void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error 
{
    NSLog(@"gick inte att hitta position!");
    map.showsUserLocation = YES;
    MKCoordinateRegion mapregion;
    mapregion.center.latitude =(59.329444);
    mapregion.center.longitude =(18.068611);
    mapregion.span.latitudeDelta = 0.03;
    mapregion.span.longitudeDelta = 0.03;
    mapregion = [map regionThatFits:mapregion];
    [map setRegion:mapregion animated:TRUE];
}

- (void)viewDidLoad
{
    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    map.delegate = self;
}

我真的希望有人知道如何做到这一点......

4 个答案:

答案 0 :(得分:9)

您的问题是,每次更新用户位置时,您都要设置地图的中心。这是一个解决方案......在您的标题中:

BOOL userLocationShown;

然后......

- (void) mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if(userLocationShown) return;
    // ... your code
    userLocationShown = YES;
}

或者,如果您不希望将地图置于用户的中心,您只需删除以下行:

    mapregion.center.latitude = map.userLocation.coordinate.latitude;
    mapregion.center.longitude = map.userLocation.coordinate.longitude;
    mapregion.span = MKCoordinateSpanMake(0.005,0.005);
    [map setRegion:mapregion animated:YES];

答案 1 :(得分:6)

如果设备仍在获取位置更新,即使您忽略它们,它也会运行GPS并烧毁电池。一旦你锁定了它们的位置,或者通过检查它们移动了多少次,或者测量了修复的准确性(CLLocation.horizo​​ntalAccuracy),你可以简单地关闭地图视图上的位置更新,如下所示:

self.showsUserLocation = NO;

如果你一直在使用CLLocationManager,那就是

[locationManager stopUpdatingLocation];

答案 2 :(得分:1)

我建议将这些好的答案组合成一个解决方案 - 在达到所需的水平精度后,停止强制地图返回到您的位置。 100米对我有好处,但可以随意使用不同的数字:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if (userLocation.location.horizontalAccuracy < 100) { // less than 100 metres
        return;
    }
    // Your existing code
}

答案 3 :(得分:0)

我为类似情况所做的是创建一个变量来跟踪我将地图居中的次数,并且只允许它运行3到4次。我之所以这样做,是因为如果我只对用户进行一次中心,有时连接不良的区域会导致地图不以使用为中心,而是偏离了很远的距离。所以你可以这样做:

NSInteger timesUpdated = 0;

- (void) mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if(timesUpdated<2) return;
    // ... your code
    timesUpdated++;
}