在与 MKOverlayViews 和 MKMapKit 的许多问题作斗争之后,我发现自己又遇到了一个问题。我正在使用 MKOverlayPathView 子类在屏幕上绘制一个奇异的大覆盖(它目前覆盖伦敦)。在那个叠加层中有很多彩色方块供争论:
- (void)drawMapRect:(MKMapRect)mapRect
zoomScale:(MKZoomScale)zoomScale
inContext:(CGContextRef)context
{
int size = 0;
min = 0;
max = 0;
CGFloat alpha = 0.4f;
int recursionLevel = 4;
QuadNodeOverlay *quadNodeOverlay = (QuadNodeOverlay *)self.overlay;
Cluster *clusters = quadtree_clusters(quadNodeOverlay.quadTree, recursionLevel, &size);
if (clusteringMethod == 1) {
/* Draw paths/squares */
CGPathRef *paths = [self createPaths:clusters size:size];
for (int i = 0; i < size; i++) {
CGPathRef path = paths[i];
Cluster cluster = clusters[i];
CGContextBeginPath(context);
CGContextAddPath(context, path);
//CGContextSetFillColorWithColor(context, colors[cluster.depth]);
CGColorRef gradientColor = [self newColor:cluster.count];
CGContextSetFillColorWithColor(context, gradientColor);
CGContextDrawPath(context, kCGPathFillStroke);
CGColorRelease(gradientColor);
CGPathRelease(path);
}
free(paths);
} else if (clusteringMethod == 2) {
// CUT
}
[self setAlpha:alpha];
}
上面的代码不完整,但为这个问题提供了坚实的基础。无论我要绘制多少个正方形,该代码都可以正常工作并且执行得非常快。我遇到的问题是低于某个点,我没有绘制此叠加层;我在包含地图的视图控制器中管理它:
- (void)mapView:(MKMapView *)map regionDidChangeAnimated:(BOOL)animated {
self.annotations = [locationServer itemsForMapRegion:map.region withMapView:map maxCount:100];
NSLog(@"There are like %d cards dude.",[self.annotations count]);
if ( [self.annotations count] > 40) {
[mapView removeAnnotations:annotations];
// Cluster
if (![[mapView overlays] containsObject:quadClusters]) {
[mapView addOverlay:quadClusters];
}
} else {
// Don't
[mapView removeOverlay:quadClusters];
// Add pins.
[mapView removeAnnotations:annotations];
[mapView addAnnotations:annotations];
}
}
同样,这段代码现在可以很好地满足我的目的。问题是当我放大到不显示集群的级别时,但是当我缩小时,单个注释是在我缩小覆盖层时呈现的,没有透明度。可见:
作为脚注。从覆盖中删除 setAlpha 并修改绘制正方形的代码以读取:
CGColorRef gradientColor = [self newColor:cluster.count];
CGColorRef alphaGradientColor = CGColorCreateCopyWithAlpha(gradientColor, alpha);
CGContextSetFillColorWithColor(context, alphaGradientColor);
解决了这个问题,但是将 alpha 通道应用到整个覆盖层肯定会更有效。