iOS 核心位置在 viewDidLoad 中将 Pin 设置为用户位置

Posted

技术标签:

【中文标题】iOS 核心位置在 viewDidLoad 中将 Pin 设置为用户位置【英文标题】:iOS Core Location Set Pin to user location in viewDidLoad 【发布时间】:2011-07-13 02:01:54 【问题描述】:

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

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

尚未调用,经纬度为 0.000000。有没有办法在我的 viewDidLoad 或任何其他解决方案中调用此方法,以在应用程序加载时使 pin 出现在我的起始位置?

更新,添加注释代码

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

【问题讨论】:

似乎仍然无法正常工作 【参考方案1】:

MKMapView 会在您设置mapView.showsUserLocation = YES 时自动放置MKUserLocation 类的注解。

您可以通过在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 ***//
    

最后的评论:

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

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

【讨论】:

我同意这一切,并且只是指出,如果目标是在@Matt 的 Update中的用户位置添加图钉> 部分,您可以通过查看位置的 horizontalAccuracy 属性并等待添加注释直到准确性满足您的要求来减轻 Final Comment 的担忧。【参考方案2】:

我从未找到手动调用该方法的方法。我相信这是一个完全被动的委托方法。对不起。

【讨论】:

【参考方案3】:

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

【讨论】:

您能否展示有关如何等待 didUpdateLocation,然后删除 pin 的代码? -locationManager:didUpdateToLocation:you 在您的位置管理器委托中实现的方法。您不需要任何特殊代码,只需将您要在-viewDidLoad 中执行的代码添加到didUpdateToLocation: 即可。或者,将它放在一个单独的方法中并从didUpdateToLocation: 调用它。您可能希望它仅在您第一次获得位置时运行,而不是每次都运行;如果是这种情况,请使用标志来确定代码之前是否运行过。

以上是关于iOS 核心位置在 viewDidLoad 中将 Pin 设置为用户位置的主要内容,如果未能解决你的问题,请参考以下文章

UIView 核心动画在 viewdidLoad 方法中不起作用?

核心位置,MapKit 错误

如何在iOS(目标C)中将字符从一个位置修剪到另一个位置?

Swift - 如果未授予核心位置请求权限

iOS 11 搜索栏中的搜索文本字段位置错误

模拟中的核心定位问题