iOS - Mapkit保持动画用户位置每当地图视图的变化(滚动,缩放)



我使用CLLocationManager的坐标在地图上显示用户的位置。每次我移动或缩放地图时,用户位置引脚(带有声纳效果的蓝色引脚)都会消失,然后重新出现在地图上。(我指的不是声纳动画效果。蓝点真的消失了,然后在)中重新激活。

当地图滚动/缩放时,我没有调用任何其他方法。使用断点,在map的委托方法中只调用返回的nil:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    //User's Pin
    if([annotation class] == MKUserLocation.class) {
        return nil;
    }
....rest of my code here, nothing else is called as I am only plotting user at this time...
}

在我最初的回答中,我认为目标是替换当您使用showUserLocation = YESuserTrackingMode = MKUserTrackingModeFollowMKMapView时获得的闪烁蓝点。因此,我展示了如何用图像或标准引脚替换它。

但事实证明,问题不在于有一个蓝点显示当前位置,而是它的动画被打断了,当用户在地图上平移和缩放时,它会出现和消失。

如果调用removeAnnotations并删除所有注释(包括系统生成的MKUserLocation注释),我已经看到了这种行为。如果你关闭showUserLocation然后再打开它,我也看到了这种行为。

OP指出这些情况都不适用,但对于将来的读者,这些是可能导致这种行为的一些注意事项。


原始回答:

最简单的答案是确保您的控制器是MKMapViewdelegate,然后定义检测MKUserLocationviewForAnnotation,并用您想要的任何内容替换注释视图。例如,如果您想显示一个@"user.png"图像,它可能看起来像:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
    {
        NSString *annotationIdentifier = @"userlocation";
        MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
        if (annotationView)
        {
            annotationView.annotation = annotation;
        }
        else
        {
            annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
            annotationView.image = [UIImage imageNamed:@"user.png"];
        }
        return annotationView;
    }
    // again, if you had other annotation types, such as MKPointAnnotation,
    // handle them here
    if ([annotation isKindOfClass:[MKPointAnnotation class]])
    {
        ...
    }
    return nil;
}

或者,如果你想显示一个标准的引脚,你可以:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
    {
        if ([annotation isKindOfClass:[MKUserLocation class]])
        {
            NSString *annotationIdentifier = @"userlocation";
            MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
            if (annotationView)
            {
                annotationView.annotation = annotation;
            }
            else
            {
                annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
            }
            return annotationView;
        }
    }
    // again, if you had other annotation types, such as MKPointAnnotation,
    // handle them here
    if ([annotation isKindOfClass:[MKPointAnnotation class]])
    {
        ...
    }
    return nil;
}

捕获viewForAnnotation委托方法下的默认用户位置注释,因此它不会被绘制。你可以使用布尔值来打开和关闭它,或者与LocationManager一起创建你自己的自定义注释。这个链接应该能让你找到正确的方向:

用户位置编号

如果您使用标准的mapciew.showsUserLocation = true;来绘制用户的位置,并且它在屏幕上滑动而不是在位置上脉动,那么这可能是因为您的viewForAnnotation方法。请确保你只是添加的大头针动画,而不是mapview添加的用户位置动画。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
    {
      return nil;
    }
    //do stuff to the annotations that you added
}

相关内容

  • 没有找到相关文章

最新更新