我有一个带有大量注释(8000+)的MapView。在所有注释都可见的情况下滚动地图会降低性能。所以,当我们在可见区域时,我有想法隐藏一些注释。我在论坛中找到了this thread,但它并没有解决我的问题。
我通过编写这段代码尝试了另一种解决方案
- (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];
}
}
}
但我不想隐藏其中几个注释中的所有注释。 知道如何以有效的方式做到这一点吗?
答案 0 :(得分:3)
您正在寻找的是一种聚类注释的方法,这意味着显示单个注释,其中有几个注释非常接近。如果你想要做到这一点,这可能会有点复杂,但如果你搜索网络,你会发现几个讨论聚类策略和算法的地方。我已将它们中的一些链接到了下面。
Applidium网站上的This blog post讨论了一个这样的策略,现在有几个关于Github的项目(mapkit-clusters,kingpin,RevClusterMap)可以处理群集为了你。如果不出意外,请查看代码,您将了解如何处理问题。
当我的团队正在处理这个问题时,我们选择了其中一个WWDC视频(this one,我认为(需要开发人员帐户))中描述的解决方案,我们对其进行了一些修改以提高性能。
请注意,您可能必须找到一种方法让用户在点击群集注释时知道。我们使用自定义标注来完成此操作,该标注列出了该单个注释所代表的所有注释。