我想在 MKMap 中使用集群,但不想使用第 3 方框架。 为此,我从 https://developer.apple.com/library/ios/samplecode/PhotoMap/Introduction/Intro.html 下载代码 但我发现当我随机旋转和缩放 map 时它卡住了。如果您还有其他演示,请帮助我。
最佳答案
我刚刚也遇到了那个示例代码中的问题。现有代码不适用于可旋转的 map 。
有两种情况会导致非常长的循环或无限循环。
如果将 map 旋转 180 度,最终会出现 mapView 左侧的经度大于 mapView 右侧的经度的情况。如果
leftCoordinate
大于rightCoordinate
,则gridSize
变为负数。在 while 循环中,我们将 map 矩形的原点增加gridSize
,直到它大于endX
/endY
。但如果gridSize
为负数,原点实际上会变小,并且不会达到 endX 条件(没有算术下溢)。如果将 map 旋转 90 度或 270 度,最终会得到非常相似的两个经度,因此 gridSize 会非常小甚至为 0,并且循环需要很长时间(或者在0 永远)完成。
第一个问题可以通过在 gridSize
上使用 abs()
来解决。第二个问题需要改变rightCoordinate
的计算,所以它使用点bucketSize, bucketSize
而不是bucketSize, 0
。完成后,我们将当前的 gridSize
变量更改为 gridSizeX
,并引入一个使用 MapPoints 的 .y 部分的 gridSizeY
。
这是原始代码:
// PhotoMapViewController.m, line 199+
// determine how wide each bucket will be, as a MKMapRect square
CLLocationCoordinate2D leftCoordinate = [self.mapView convertPoint:CGPointZero toCoordinateFromView:self.view];
CLLocationCoordinate2D rightCoordinate = [self.mapView convertPoint:CGPointMake(bucketSize, 0) toCoordinateFromView:self.view];
double gridSize = MKMapPointForCoordinate(rightCoordinate).x - MKMapPointForCoordinate(leftCoordinate).x;
将被替换为:
// determine how wide each bucket will be, as a MKMapRect square
CLLocationCoordinate2D leftCoordinate = [self.mapView convertPoint:CGPointZero toCoordinateFromView:self.view];
CLLocationCoordinate2D rightCoordinate = [self.mapView convertPoint:CGPointMake(bucketSize, bucketSize) toCoordinateFromView:self.view];
double gridSizeX = fabs(MKMapPointForCoordinate(rightCoordinate).x - MKMapPointForCoordinate(leftCoordinate).x);
double gridSizeY = fabs(MKMapPointForCoordinate(rightCoordinate).y - MKMapPointForCoordinate(leftCoordinate).y);
double gridSize = MAX(gridSizeX, gridSizeY);
关于ios - iPhone MKMapView 中的注释聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28957431/