14

如果用户缩小 MKMapView,我希望彼此靠近的 MKAnnotations 自动分组到一个“组”注释中。如果用户放大,“组”注释应再次拆分为唯一/原始注释。

苹果已经在 iOS 4 Photos.app 中做到了这一点

有没有一种通用的“预定义”方式来做到这一点?

4

3 回答 3

6

它在地图上正常使用 1500 多个注释:

-(void)mapView:(MKMapView *)mapView_ regionDidChangeAnimated:(BOOL)animated
{
    NSMutableSet * coordSet = [[NSMutableSet alloc] init];

    for(id<MKAnnotation> an in mapView_.annotations)
    {
        if([an isKindOfClass:[MKUserLocation class]])
            continue;

        CGPoint point = [mapView_ convertCoordinate:an.coordinate toPointToView:nil];
        CGPoint roundedPoint;

        roundedPoint.x = roundf(point.x/10)*10;
        roundedPoint.y = roundf(point.y/10)*10;

        NSValue * value = [NSValue valueWithCGPoint:roundedPoint];

        MKAnnotationView * av = [mapView_ viewForAnnotation:an];

        if([coordSet containsObject:value])
        {
            av.hidden = YES;
        }
        else
        {
            [coordSet addObject:value];
            av.hidden = NO;
        }
    }

    [coordSet release];
}
于 2012-02-14T17:24:05.220 回答
4

这是一个绝妙的主意。我正在开发一个类似的应用程序,我希望你不介意我是否也实现了这个概念:)。

为了尽我所能回答您的问题,不,我认为没有预定义的方法可以做到这一点。

我能想到的最好方法(在查看 iOS4 照片应用程序之后)是使用mapView:regionDidChangeAnimated:委托方法。每当用户滚动/缩放时,都会调用此方法。

在该方法中,您可以进行一些快速的几何数学运算来确定您的点是否“足够接近”以考虑合并。一旦它们被“合并”,您将删除一个或两个注释,并将另一个注释放回引用两者的同一位置(您可以非常轻松地创建一个 AnnotationCluster 类,它可以符合 MKAnnotation 但也持有NSArray 的注释,还包含用于“分解”或“吸收”其他注释和/或 AnnotationCluster 实例等的方法。

当我说“快速几何数学”时,我指的是两个点相对于地图跨度的距离,并将它们的相对距离作为整个地图跨度的百分比。

如果您有数百个注释,那将变得棘手,因为我无法立即想到实现该 w/oa 双循环的好方法。

你怎么看?

于 2010-07-17T14:59:59.340 回答
0

这个项目做了一些有趣的事情。不过,在更改代码中的太多内容之前,请先查看报告的问题。因为它可能还不足以满足您的需求。

我个人最终实现了这个

于 2013-11-10T20:06:27.560 回答