我对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;
}
我真的希望有人知道如何做到这一点......
答案 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.horizontalAccuracy),你可以简单地关闭地图视图上的位置更新,如下所示:
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++;
}