c# - Xamarin - iOS map 上的多个多边形
<p><p>我目前关注 <a href="https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/map/polygon-map-overlay/" rel="noreferrer noopener nofollow">this</a>将多边形添加到 map 的教程。我需要能够向我的 map 添加多个多边形,所以我稍微更改了代码,以便我可以使用 <code>addOverlays</code> 来接收 <code>IMKOverlay</code> 对象数组,而不是一个 <code>addOverlay</code> 只接受一个 <code>IMKOverlay</code> 对象。 </p>
<p>但这不起作用...它只在 map 上绘制第一个多边形!</p>
<pre><code>void addPolygonsToMap()
{
overlayList = new List<IMKOverlay>();
for (int i = 0; i < polygons.Count; i++)
{
CLLocationCoordinate2D[] coords = new CLLocationCoordinate2D.Count];
int index=0;
foreach (var position in polygons)
{
coords = new CLLocationCoordinate2D(position.Latitude, position.Longitude);
index++;
}
var blockOverlay = MKPolygon.FromCoordinates(coords);
overlayList.Add(blockOverlay);
}
IMKOverlay[] imko = overlayList.ToArray();
nativeMap.AddOverlays(imko);
}
</code></pre>
<p>在 <a href="https://forums.xamarin.com/discussion/12585/adding-multiple-overlays-to-a-map-view" rel="noreferrer noopener nofollow">this</a>讨论中,似乎每次我需要向 map 中添加另一个多边形时,我都必须调用 <code>MKPolygonRenderer</code> 的新实例,但我不确定这个示例如何转换为我的代码。这是我的 <code>MKPolygonRenderer</code> 函数:</p>
<pre><code>MKOverlayRenderer GetOverlayRenderer(MKMapView mapView, IMKOverlay overlayWrapper)
{
if (polygonRenderer == null && !Equals(overlayWrapper, null)) {
var overlay = Runtime.GetNSObject(overlayWrapper.Handle) as IMKOverlay;
polygonRenderer = new MKPolygonRenderer(overlay as MKPolygon) {
FillColor = UIColor.Red,
StrokeColor = UIColor.Blue,
Alpha = 0.4f,
LineWidth = 9
};
}
return polygonRenderer;
}
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>每次调用 <code>OverlayRenderer</code> 时创建一个新的渲染器实例,不需要将渲染器缓存在类级别变量中,因为 <code>MKMapView</code> 会根据需要缓存渲染器.</p>
<h3>子类<code>MKMapViewDelegate</code>:</h3>
<pre><code>class MyMapDelegate : MKMapViewDelegate
{
public override MKOverlayRenderer OverlayRenderer(MKMapView mapView, IMKOverlay overlay)
{
switch (overlay)
{
case MKPolygon polygon:
var prenderer = new MKPolygonRenderer(polygon)
{
FillColor = UIColor.Red,
StrokeColor = UIColor.Blue,
Alpha = 0.4f,
LineWidth = 9
};
return prenderer;
default:
throw new Exception($"Not supported: {overlay.GetType()}");
}
}
}
</code></pre>
<h3>实例化并将委托(delegate)分配给您的 map :</h3>
<pre><code>mapDelegate = new MyMapDelegate();
map.Delegate = mapDelegate;
</code></pre>
<p>注意:将 <code>MyMapDelegate</code> 的实例存储在类级别变量中,因为您不想被 GC 处理</p>
<h3>更新:</h3>
<p><code>MKMapView</code> 涉及在其 map 上显示叠加层的两个步骤。 </p>
<pre><code>1. Calling `AddOverlay` and `AddOverlays`
</code></pre>
<p>首先,您向 map 添加符合 <code>IMKOverlay</code> 的叠加层。有基本的内置类型,例如 <code>MKCircle</code>、<code>MKPolygon</code> 等……但您也可以设计自己的叠加层;即定义恶劣天气(闪电、暴风云、 Tornado 等)位置的叠加层。这些 MKOverlays 描述了项目的地理位置<strong>但不</strong>如何绘制它。</p>
<pre><code>2. Responding to `OverlayRenderer` requests
</code></pre>
<p>本地图的显示区域与其中一个叠加层相交时, map 需要将其绘制在屏幕上。调用 map 的委托(delegate)(您的 <code>MKMapViewDelegate</code> 子类)来提供一个 <code>MKOverlayRenderer</code>,它定义了绘制例程以在 map 上绘制叠加层。 </p>
<p>此绘图涉及使用 Core Graphics 例程(UIKit 可以使用但有一些限制)将叠加层的地理坐标转换为本地显示坐标(可以使用辅助方法)。 MKCircleRenderer、MKPolygonRenderer 等有基本的内置渲染器,可以使用,也可以编写自己的 <code>MKOverlayRenderer</code> 子类。 </p>
<p>您可以提供一种自定义方式来渲染 <code>MKCircle</code> 叠加层,可能是目标样式的红/白多环靶心,而不是默认的圆形渲染器绘制它的方式,或者自定义渲染器在 <code>MKPolygon</code> 的范围内绘制强 Storm 符号以匹配您的自定义强 Storm 叠加层。</p>
<p>我的示例代码:</p>
<p>由于您使用 <code>MKPolygon</code> 来构建叠加层,因此您可以使用 <code>MKPolygonRenderer</code> 来显示它们。在我的示例中,我提供了一个模式匹配开关 (C# 6),它为您添加到 map 中的 <em>每个</em> MKPolygon 返回一个半透明的红色/蓝色 MKPolygonRenderer(如果您添加了一个非基于 MKPolygon 的叠加层)它会抛出异常)。</p></p>
<p style="font-size: 20px;">关于c# - Xamarin - iOSmap 上的多个多边形,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/46148371/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/46148371/
</a>
</p>
页:
[1]