iOS核心位置设置在viewDidLoad中固定用户位置

时间:2011-07-13 02:01:55

标签: iphone objective-c mapkit coordinates core-location

我正在尝试将地图注释设置为用户的当前位置。我试图在viewDidLoad方法中设置引脚,但是因为方法

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

尚未调用,lat和long为0.000000。有没有办法在我的viewDidLoad或任何其他解决方案中调用此方法,以便在应用程序加载时将引脚显示在我的起始位置?

更新,添加了注释代码

CLLocationCoordinate2D theCoordinate;
theCoordinate.latitude = (_currentLocation.latitude);
    theCoordinate.longitude = (_currentLocation.longitude);
    NSLog(@"The Coordinate Value:");
    NSLog(@"%f, %f",theCoordinate.latitude,theCoordinate.longitude);

    DDAnnotation *annotation = [[[DDAnnotation alloc] initWithCoordinate:theCoordinate addressDictionary:nil] autorelease];
    annotation.title = @"Drag to Move Pin";
    annotation.subtitle = [NSString stringWithFormat:@"%f %f", annotation.coordinate.latitude, annotation.coordinate.longitude];

    [self.mapView addAnnotation:annotation];

更新2 仍然无效,代码在didUpdateLocation方法

static BOOL annotationAdded = NO;

if (!annotationAdded) {
    annotationAdded = YES;
        CLLocationCoordinate2D theCoordinate;
        theCoordinate.latitude = _currentLocation.latitude;
        theCoordinate.longitude = _currentLocation.longitude;
        //Sets Initial Point to Africa Because Method to obtain current Location
        //Hasen't Fired when View Loads
        theCoordinate.latitude = (mapView.userLocation.coordinate.latitude);
        theCoordinate.longitude = (mapView.userLocation.coordinate.longitude);
        NSLog(@"The Coordinate Value:");
        NSLog(@"%f, %f",theCoordinate.latitude,theCoordinate.longitude);

        DDAnnotation *annotation = [[[DDAnnotation alloc] initWithCoordinate:theCoordinate addressDictionary:nil] autorelease];
        annotation.title = @"Drag to Move Pin";
        annotation.subtitle = [NSString stringWithFormat:@"%f %f", annotation.coordinate.latitude, annotation.coordinate.longitude];

        [self.mapView addAnnotation:annotation];
}

3 个答案:

答案 0 :(得分:3)

设置MKMapView时,

MKUserLocation会自动放置类mapView.showsUserLocation = YES的注释。

您可以在mapView:viewForAnnotation:中将此注释的默认视图替换为您想要的任何默认注释视图:

- (MKAnnotationView *) mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        // replace the following with code to generate and return custom user position annotation view
        return customAnnotationView;
    }

    //*** other code ***//
}

更新

如果您想要做的只是在视图加载时在用户所在位置设置一个引脚(一次),那么您将不得不等到手机可以获取所需的数据,因为这需要一些时间。在第一次调用时在mapView:didUpdateUserLocation中添加注释,这应该可以解决问题:

- (void) mapView:(MKMapView *)theMapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    static BOOL annotationAdded = NO;

    if (!annotationAdded) {
        annotationAdded = YES;
        //*** add annotation to mapView ***//
    }
}

最终评论:

我通常会避免在第一次调用此方法时在用户位置设置静态引脚,而是选择仅使用默认的标准蓝点。这是因为手机中的位置服务需要时间来找到用户位置的准确读数,但为了节省时间,它会尽快向您发送位置更新。这意味着第一次位置更新可能不是非常准确,但后续更新可能更准确。这就是为什么标准蓝点有时会在出现在地图上的最初几分钟内频繁改变位置的原因。

只是一个警告。显然,你选择做什么取决于你的应用的目的是什么。

答案 1 :(得分:0)

我从未找到过手动调用该方法的方法。我相信这是一种完全被动的委托方法。遗憾。

答案 2 :(得分:0)

设备确定位置需要一些时间 - 您无法通过调用-locationManager:didUpdateToLocation:您自己来加速该过程。你需要使用@Matt的建议让地图绘制用户的位置,否则等待-...didUpdateToLocation:被调用然后采取行动。