ios - MKMapViewDelegate : How to identifiy overlay in rendererForOverlay
<p><p>我像这样将两个不同的 <code>MKGeodesicPolyline</code> 实例添加到 <code>MKMapView</code></p>
<pre><code>CLLocation *LAX = [ ...];
CLLocation *JFK = [ ...];
CLLocation *LHR = [ ...];
CLLocationCoordinate2D laxToJfkCoords = {LAX.coordinate, JFK.coordinate};
CLLocationCoordinate2D jfkToLhrCoords = {JFK.coordinate, LHR.coordinate};
MKGeodesicPolyline *laxToJfk = ;
MKGeodesicPolyline *jfkToLhr = ;
;
;
</code></pre>
<p>我想用不同的样式渲染这两个叠加层,需要在 <code>rendererForOverlay</code> 委托(delegate)方法中进行配置。</p>
<pre><code>- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay {
if (!]) {
return nil;
}
MKPolylineRenderer *renderer = [ initWithPolyline:(MKPolyline *)overlay];
renderer.lineWidth = 3.0f;
// How to set different colors for LAX-JFK and JFK-LHR?
renderer.strokeColor = ;
return renderer;
}
</code></pre>
<p>我的问题是在上述方法中有哪些选项可以识别两个不同的叠加层?</p>
<p>这是我到目前为止的考虑:</p>
<ol>
<li>子类化:不是一个选项,因为 <code>MKGeodesicPolyline</code> 是通过静态工厂方法初始化的。</li>
<li>在属性中保留对覆盖层的引用,然后将委托(delegate)的 <code>overlay</code> 参数与那些进行比较。这确实有效,但感觉有点笨拙。此外,对于两个以上的覆盖,需要使用 <code>NSSet</code> 或 <code>NSArray</code> 扩展此方法。</li>
</ol>
<p>还有什么我可以做的来简化这个吗? <code>MKGeodesicPolyline</code> 似乎不具备任何可用于标记的属性。</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>子类化的一种替代方法是使用 <a href="http://nshipster.com/associated-objects/" rel="noreferrer noopener nofollow">associated objects</a> .但通常不鼓励使用它。</p>
<p>一个更长但更稳定的解决方案是制作一个自定义的 <code>MKOverlay</code> 和一个 <code>MKOverlayRenderer</code> 将它们的大部分实现转发到 <code>MKGeodesicPolyline< 的私有(private)实例</code> 和 <code>MKPolylineRenderer</code> 分别。然后您可以添加自定义属性来设置颜色。</p></p>
<p style="font-size: 20px;">关于ios - MKMapViewDelegate : How to identifiy overlay in rendererForOverlay,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/32348942/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/32348942/
</a>
</p>
页:
[1]