在我最初的答案中,我认为目标是替换使用 a 时得到的闪烁蓝MKMapView
点showUserLocation = YES
和userTrackingMode = MKUserTrackingModeFollow
。因此,我展示了如何用图像或标准图钉替换它。
但事实证明,问题不在于显示当前位置的蓝点,而是它的动画被打断,随着用户在地图上平移和缩放,它出现和消失。
removeAnnotations
如果您调用并删除所有注释(包括系统生成的MKUserLocation
注释),我已经看到了这种行为。showUserLocation
如果您关闭并重新打开它,我也看到了这种行为。
OP 指出这些情况都不适用,但对于未来的读者来说,这些是可能导致这种行为的一些考虑因素。
原答案:
最简单的答案是确保您的控制器delegate
适用于您的MKMapView
,然后定义viewForAnnotation
检测 a 的 a MKUserLocation
,并将注释视图替换为您想要的任何内容。例如,如果您有一张@"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;
}