【问题标题】:iPhone - MapKit : How may I customize the color and alpha of an overlay on the fly?iPhone - MapKit:我如何动态自定义叠加层的颜色和 alpha?
【发布时间】:2011-06-21 09:59:50
【问题描述】:

我有一个 MapView,我在上面放置了一些叠加层 (MKPolygon)。
我必须维护 MKPolygon 组。

为此,我有一个 PolyGonGroupClass 来保存每个多边形以及应该用于显示所有这些多边形的颜色和 alpha。

因此,每次我找到一个多边形时,我都会将其添加为地图叠加层并记住到正确的多边形组中。
我所有的多边形组都保存在一个实例变量中。

[self.mapView addOverlay:poly];
[thecorrectpolygroup addObject:poly];
...
[self.mypolygroups addObject:thecorrectpolygroup];


@interface PolyGonGroupClass : NSObject {
    UIColor* __color;
    float __alpha;
    NSMutableArray* __polygons;
}

嗯……

此时,我如何告诉 MapView 每个多边形的颜色和 alpha 并在其中一种颜色发生变化时即时更新它们?

我找到了一个- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 方法,但我不知道如何使用它来检索我放入记忆值中的值。

我想我应该使用 overlay 参数,但是如何检索与该覆盖对应的正确多边形组?

【问题讨论】:

  • 你可以调用 [mapView setNeedsDisplay];我很确定这也会迫使图层重绘。
  • @Lee Armstrong :问题不在于如何强制重绘(您的提示是正确的),而在于我如何个性化每个叠加层。
  • 不确定我是否理解。您需要在 viewForOverlay 中使用多边形,mapkit 将为您绘制。你在 viewForOverlay 中得到了什么代码?

标签: iphone mapkit overlay customization


【解决方案1】:

viewForOverlay 中,您可以循环遍历您的mypolygroups 数组并检查覆盖是否在该组的polygons 数组中:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKPolygon class]])
    {
        MKPolygonView *pv = [[[MKPolygonView alloc] initWithPolygon:overlay] autorelease];

        for (PolyGonGroupClass *pgc in mypolygroups) 
        {
            if ([pgc.polygons containsObject:overlay])
            {
                pv.fillColor = pgc.color;
                pv.alpha = pgc.alpha;
                break;
            }
        }

        return pv;
    }

    return nil;
}

但是,要使其正常工作,您必须稍微更改调用 addOverlay 的位置。在您显示的代码中,您在将addOverlay 添加到多边形数组之前以及将组添加到 mypolygroups 数组之前调用了它。这会导致viewForOverlay 在数组包含数据之前触发。

相反,在 mypolygroups 数组完全填充后,仅移动 addOverlay 调用。所以在将最后一组添加到mypolygroups之后:

...
[self.mypolygroups addObject:theLastPolygroup];

for (PolyGonGroupClass *pgc in mypolygroups) 
{
    for (MKPolygon *p in pgc.polygons) 
    {
        [mapView addOverlay:p];
    }
}


最后,要在组已经在地图上之后更新组的颜色和 alpha,您可以执行以下操作:

//pgc is some instance of PolyGonGroupClass
pgc.alpha = newAlpha;
pgc.color = newColor;

for (MKPolygon *p in pgc.polygons) 
{
    MKPolygonView *pv = (MKPolygonView *)[mapView viewForOverlay:p];
    pv.alpha = pgc.alpha;
    pv.fillColor = pgc.color;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多