MKMapView 不更新用户位置图像

Posted

技术标签:

【中文标题】MKMapView 不更新用户位置图像【英文标题】:MKMapView not updating user position image 【发布时间】:2011-09-18 07:01:56 【问题描述】:

我的 MKMapView 会在启动时显示我的位置,但图像永远不会“跟随”我。位置更新,屏幕跟随我,但原始的“用户位置”图像留在后面。

这里是一些代码sn-ps:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation

    static NSString* AnnotationIdentifier = @"Annotation";
    MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
    if(!pinView)
    
        MKPinAnnotationView *customPinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease];

        if(annotation == mapView.userLocation) customPinView.image = [self rotate:[UIImage imageNamed:@"myCar.png"] orientation:UIImageOrientationUp];
        else customPinView.image = [UIImage imageNamed:@"randomPin.png"];

        customPinView.animatesDrop = NO;
        customPinView.canShowCallout = YES;
        return customPinView;
    
    else
    
        pinView.annotation = annotation;
    
    return pinView;


-(void)locationUpdate:(CLLocation *)location

    CLLocationCoordinate2D loc = [location coordinate];
    if(isFollowing)
        [myMapView setCenterCoordinate:loc];//Works

在我的viewDidLoad 中,我确实打电话给:[myMapView setShowsUserLocation:YES];,这确实有效。

所以基本上在某个地方我忽略了更新我的位置,或者我最有可能为我的当前位置绘制新图像的位置。

谁能看到我在那里遗漏了什么或做错了什么,因为它没有关注我的位置更新?

谢谢。

【问题讨论】:

问题解决了吗?我有一个完全相同的。 抱歉,不记得了 - 发生的时间太长了 【参考方案1】:

尚不清楚这是否是问题,但 viewForAnnotation 方法看起来不正确。

注释图像仅在创建注释视图时设置。如果重新使用视图,则更新注释属性,但不会更新图像。重复使用的视图可能用于需要不同图像的不同类型的注释。

该方法应如下所示:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation

    static NSString* AnnotationIdentifier = @"Annotation";
    MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
    if (!pinView)
    
        pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease];               
        pinView.animatesDrop = NO;
        pinView.canShowCallout = YES;
    
    else
    
        pinView.annotation = annotation;
    

    if (annotation == mapView.userLocation) 
        pinView.image = [self rotate:[UIImage imageNamed:@"myCar.png"] orientation:UIImageOrientationUp];
    else 
        pinView.image = [UIImage imageNamed:@"randomPin.png"];

    return pinView;

【讨论】:

谢谢!看起来它现在可以工作了。您的解决方案是我怀疑我应该做但不知道如何做的。测试后将标记为正确。 @Anna,这个解决方案不能解决问题。图像仍被绘制,视图跟随位置,但图像仍保留在其原始位置。 是否从 CLLocationManager 的 didUpdateToLocation 委托方法调用 locationUpdate?您在地图视图的 didUpdateUserLocation 委托方法中是否还有任何代码?你能检查一下 CLLocationManager 的当前位置坐标是否与地图视图的 userLocation 匹配吗?另外,如果您点击地图上的 userLocation 注释(没有移动的注释),它会显示“当前位置”吗?另一件要检查的事情:在 viewForAnnotation 的顶部,检查注解是否为 MKUserLocation 类型,在这种情况下返回 nil,看看蓝点是否跟随你。 您的基本方法应该有效,我在显示的代码中看不到任何明显的问题。最后,由于无论如何您都在使用自己的图像作为当前位置,因此您始终可以将 showsUserLocation 设置为 NO 并手动为当前位置添加和移动您自己的注释(它必须使用实现 setCoordinate 的类,以便您可以更新locationUpdate 中的坐标)。 我也遇到了同样的问题。由于某些奇怪的原因,似乎 MKUserLocation 没有更新。最好的选择是确实不显示任何内容并创建自己的 Annotation 和 AnnotationView。

以上是关于MKMapView 不更新用户位置图像的主要内容,如果未能解决你的问题,请参考以下文章

MKMapView 用户位置 - 授权

MKMapView 在 iOS 6 上显示用户位置时崩溃

iOS 8 MKMapView 用户位置请求失败

在 MKMapView Objective c 中手动更改用户的当前位置

当用户滚动 MKMapView 时,从 Core Data 加载其他对象

WatchOS InterfaceMap 在地图上更新用户位置