MKMapView和dequeueReusableAnnotationViewWithIdentifier:

时间:2009-09-10 06:34:13

标签: iphone cocoa-touch

我有一个MKMapView同时在屏幕上显示大约1000个MKPinAnnotationView。

滚动性能非常慢。

我试图像这样正确地将我的注释视图出列:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    static NSString *viewIdentifier = @"annotationView";
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:viewIdentifier];
    if (annotationView == nil) {
        annotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewIdentifier] autorelease];
    }

    return annotationView;
}

但是我的注释视图永远不会被重用!我的地图上同时有1000个MKPinAnnotationView实例。我不禁觉得这有助于缓慢的表现。

这是将可重复使用的注释视图出列的正确方法吗?它们是不是被重用,因为它们同时在同一个屏幕上,因此需要单独的实例?

有关使用大量屏幕引脚加快滚动性能的任何提示吗?

4 个答案:

答案 0 :(得分:2)

如果您的地图一直缩小,那么它不会毫无理由地删除引脚。只有当它们不可见时,它们才会被取下。

根据经验,我可以说1000个地图引脚远远超出了基本上任何设备的稳定上限,更不用说旧设备了。

像iPhone 3G这样的旧设备甚至可能会在你开始看到印章之前达到100-150(当然这取决于你的应用正在做什么)。

我编写了一个广泛使用MKMapView的应用程序,我不得不根据设备的类型设置逻辑来限制地图上可见的引脚数。

有两种可能的解决方案

1)限制地图的缩放范围,以便用户无法缩小到目前为止他们同时看到每个图钉(我实际上之前没有这样做过所以我不知道它是否可能,但这将是一个想法)。

2)根据建议创建过滤器,限制显示的引脚。

答案 1 :(得分:1)

您的代码看起来是正确的。它们在屏幕上时不会重复使用这些引脚。它们可以在屏幕关闭的瞬间重复使用。

我认为无论它们代表什么样的引脚都可能很难区分。是否可以通过提供用户过滤选项或类似的东西来减少屏幕上的引脚数。

答案 2 :(得分:0)

您期望的是基于地图显示的当前region对注释视图进行某种“剪裁”。

请在此处查看我已详细说明的答案:MKMapView loading all annotation views at once (including those that are outside the current rect)

答案 3 :(得分:0)

您是否尝试使用iOS 4.3 SDK构建应用程序?我一直有同样的问题,注释视图只有在数百英里之外才能重复使用,但在iOS 4.3中我看到了更合理的重用行为。

MKMapView loading all annotation views at once (including those that are outside the current rect)