为啥 MKMapView 不显示当前位置红色图钉?

Posted

技术标签:

【中文标题】为啥 MKMapView 不显示当前位置红色图钉?【英文标题】:Why MKMapView is not showing current location red pin?为什么 MKMapView 不显示当前位置红色图钉? 【发布时间】:2013-07-19 09:41:04 【问题描述】:

MapView 正在显示我的当前位置,但没有出现红色图钉(或蓝色圆圈)。此设备已启用定位服务。但是,红色引脚显示在模拟器上运行相同的代码。我已经设置了必需的属性:

self.mapView.showsUserLocation = YES;

我正在使用自定义引脚,但是,“mapView:viewForAnnotation:”仅针对每个自定义注释调用,所以看起来这个方法没有针对当前位置调用,这就是它没有显示红色引脚的原因。但是,很奇怪为什么相同的代码在模拟器上运行正确。

更新 刚刚使用 mapView 创建了空的单视图项目。确实添加了 self.mapView.showsUserLocation = YES 但设备上没有显示当前位置。但是模拟器中显示了一个蓝色圆圈。我在 iPhone4 上使用 ios 6.1.2。

【问题讨论】:

【参考方案1】:

为当前位置调用mapView:viewForAnnotation:

From the docs:

如果注解参数中的对象是 MKUserLocation 类,您可以提供自定义视图来表示 用户的位置。使用默认值显示用户的位置 系统视图,返回 nil。

在该委托方法的实现中,检查传入的注解的类并进行相应处理(返回 nil 以使用蓝点或返回自定义视图)。

如果它没有被调用,则其他事情正在进行中。

【讨论】:

非常奇怪,但是在模拟器上调用“mapView:viewForAnnotation:”来获取当前位置,而不是在设备上(启用了位置服务)。怎么可能? 嗯。我唯一能想到的是,如果定位服务无法确定您的位置(室内等)——那么就没有位置可以显示。【参考方案2】:

在 mapView:viewForAnnotation 方法中添加在其他代码之前

if([a isKindOfClass:[MKUserLocation class]])
   return;

【讨论】:

【参考方案3】:

也许您每次都返回一个空 pin,因此即使您应该返回用户位置的注释,您也会返回这个空 pin。在你的 viewForAnnotation 委托中试试这个:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation

    // When returning nil, it should show the default blue dot
    if(annotation == mapView.userLocation) return nil;

    // Dequeue the annotations for actual points, do whatever, and return the correct pins

编辑:如果您的委托方法没有在设备上调用,我的猜测可能是某处存在内存泄漏。在模拟器中,内存是您使用它的计算机的内存,但在设备上,这是更受限制的。

【讨论】:

不,我用仪器检查了地图,没有泄漏。我正在使用 ARC。

以上是关于为啥 MKMapView 不显示当前位置红色图钉?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MKMapView 的 showUserLocation 属性

MKPinAnnotationView 红色图钉替换为图片

在 iPhone MKMapView 中显示用户位置蓝点

掉落的图钉的动画不起作用

用户位置(蓝点)不断变成红色图钉

MKMapView 不显示当前位置