【发布时间】:2010-07-07 12:29:26
【问题描述】:
如果用户缩小 MKMapView,我希望彼此靠近的 MKAnnotations 自动分组到一个“组”注释中。 如果用户放大,“组”注释应再次拆分为唯一/原始注释。
苹果已经在 iOS 4 Photos.app 中这样做了
是否有一种通用的“预定义”方式来做到这一点?
【问题讨论】:
标签: iphone mapkit mkmapview zooming mkannotation
如果用户缩小 MKMapView,我希望彼此靠近的 MKAnnotations 自动分组到一个“组”注释中。 如果用户放大,“组”注释应再次拆分为唯一/原始注释。
苹果已经在 iOS 4 Photos.app 中这样做了
是否有一种通用的“预定义”方式来做到这一点?
【问题讨论】:
标签: iphone mapkit mkmapview zooming mkannotation
在地图上使用超过 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];
}
【讨论】:
这是一个绝妙的主意。我正在开发一个类似的应用程序,如果我也实现了这个概念,希望你不介意:)。
为了尽我所能回答您的问题,不,我认为没有预定义的方法可以做到这一点。
我能想到的最好方法(在查看 iOS4 照片应用程序之后)是使用 mapView:regionDidChangeAnimated: 委托方法。每当用户滚动/缩放时,都会调用此方法。
在该方法中,您可以进行一些快速的几何数学运算来确定您的点是否“足够接近”以考虑合并。一旦它们被“合并”,您将删除一个或两个注释,并将另一个注释放回引用两者的相同位置(您可以非常轻松地创建一个 AnnotationCluster 类,该类可以符合 MKAnnotation 但也持有注解的 NSArray,还包含用于“分解”或“吸收”其他注解和/或 AnnotationCluster 实例等的方法。
当我说“快速几何数学”时,我指的是两个点相对于地图跨度的距离,并将它们的相对距离作为整个地图跨度的百分比。
如果你有数百个注解,那会变得棘手,因为我想不出一个没有双循环的好方法来实现它。
你觉得怎么样?
【讨论】: