1

我有一个带有大量注释(8000+)的 MapView。在所有注释可见的情况下滚动地图会降低性能。所以,我想在可见区域隐藏一些注释。我在论坛上找到了这个帖子,但它并没有解决我的问题。

我通过编写这段代码尝试了另一种解决方案

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated
{
    NSSet *annoSet = [[NSSet alloc] initWithSet:[_mapView annotationsInMapRect:_mapView.visibleMapRect]];
    NSMutableSet *annotationsSet = (NSMutableSet *)annoSet;

    NSLog(@"Annos: %i", [annotationsSet count]);

    if([annotationsSet count]>500)
    {
        for(MapViewAnnotation* annotation in annotationsSet)
        {
            [[_mapView viewForAnnotation:annotation] setHidden:YES];
        }
    }
}

这行得通,但是在该操作之后,mapView 几乎完全崩溃了,我可以改进什么?

编辑:

我的新代码如下所示:

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated
{
    NSSet *annoSet = [[NSSet alloc] initWithSet:[_mapView annotationsInMapRect:_mapView.visibleMapRect]];
    //NSMutableSet *annotationsSet = (NSMutableSet *)annoSet;

    NSLog(@"Annos: %i", [annoSet count]);

    if([annoSet count]>500)
    {
        for(MapViewAnnotation* annotation in annoSet)
        {
            [[_mapView viewForAnnotation:annotation] setHidden:YES];
        }

    }
    else if([annoSet count] <= 500)
    {
        for(MapViewAnnotation* annotation in annoSet)
        {
            [[_mapView viewForAnnotation:annotation] setHidden:NO];
        }

    }
}

但我不想将所有注释隐藏在 visibleRect 中,只是其中的几个。知道如何以有效的方式做到这一点吗?

4

1 回答 1

3

您正在寻找的是一种对注释进行聚类的方法,这意味着在有多个注释非常接近的情况下显示单个注释。如果你想把它做对,这可能会有点复杂,但是如果你搜索网络,你会发现几个讨论聚类策略和算法的地方。我已经链接到下面的一些。

Applidium 网站上的这篇博文讨论了一种这样的策略,现在 Github 上有几个项目(mapkit-clusterskingpinRevClusterMap)可以为您处理集群问题。如果不出意外,看看代码,你就会知道如何处理这个问题。

然而,当我的团队正在解决这个问题时,我们采用了 WWDC 视频之一中描述的解决方案(我认为是这个(需要开发者帐户)),我们对其进行了一些修改以提高性能。

请注意,您可能必须找到一种方法让用户知道他们何时单击了集群注释。我们使用一个自定义标注来做到这一点,该标注列出了该单个注释表示的所有注释。

于 2013-01-02T13:07:50.480 回答