如何区分几个不同的 MKPolygon 叠加层,以便我可以为每个叠加层赋予不同的属性?

Posted

技术标签:

【中文标题】如何区分几个不同的 MKPolygon 叠加层,以便我可以为每个叠加层赋予不同的属性?【英文标题】:How do I differentiate between several distinct MKPolygon overlays so I can give each one different properties? 【发布时间】:2016-08-15 13:31:52 【问题描述】:

我发现区分 MKPolygons 的唯一方法是使用 MKPolygon.version(Int: Int) 类型属性。我可以将其设置为 1、2、3 等,并给每个颜色一个不同的颜色(例如)。我想扩展 MKPolygon 以添加标签,但 Swift 扩展无法添加存储属性。我不习惯使用 MKPolygon.version(我应该这样吗?)。有没有更好的办法?

【问题讨论】:

尝试子类化 MKPolygon 辛苦了!谢谢@DavidBerry。我实际上创建了一个... static var identifier = "Blue" 等,然后在我使用的 mapView(_:rendererForOverlay:) 方法中... if let overlay = overlay as? MyPolygon && MyPolygon.identifier == "蓝色"。现在可以添加多个不同颜色和道具的多边形。 【参考方案1】:

子类MKPolygon 并将您的自定义属性放在那里:

class MyPolygon: MKPolygon 
    var identifier: String?

然后在mapView(_:rendererForOverlay:) 方法中,将其转换为您的类:

func mapView(_ mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer 
    if let overlay = overlay as? MyPolygon 
        let identifier = overlay.identifier
        // Do stuffs....
    

(我不在 Xcode 附近,Apple 的文档站点在 Swift 2 和 Swift 3 之间来回切换,因此某些函数声明可能不匹配)

【讨论】:

如果您可以提供默认值或使用可选值,这很好。否则,您将不得不为此定义初始化程序,这并不是那么简单,因为 MKPolygon 只有便利初始化程序。我最终将 MKOverlay 子类化以添加我的字段。当被问及该叠加层的渲染器时,我会生成一个 MKPolygonRenderer。【参考方案2】:

嘿,我知道这是很久以前的事了,但对于其他想知道的人来说,你完全不需要子类化 MKPolygon 来实现这一点。我试图这样做并遇到了一些问题。我确信它们可以以某种方式得到解决,但我的解决方案是制作一个 [Int : String] 类型的字典。当您最初创建多边形时,使用它的 hashValue 作为字典键并插入您想要的任何唯一 id(您也可以使用 [Int : Int] 或任何数量的其他类型)。然后稍后当您需要确定它是哪个多边形时,只需将该哈希值扔回字典中,瞧,您就有了唯一的 id。如果不清楚:

//vars/lets section:
var hashValueToUniqueID : [Int : String] = [:]

//section where polygons are generated
polygon: MKPolygon = generatePolygon() //this is a made up function
hashValueToUniqueID[polygon.hashValue] = "1234"

//section where you access polygons
var uniqueIDToFind = "1234"
if let overlays = mapView.overlays as? [MKPolygon] 
    for overlayItem in overlays 
        if hashValueToUniqueID[polygon.hashValue] == uniqueIDToFind 
            return polygon
        
    

请注意,如果您删除所有多边形并重新创建它们,您应该重新初始化字典。

【讨论】:

以上是关于如何区分几个不同的 MKPolygon 叠加层,以便我可以为每个叠加层赋予不同的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MapView 上集成雷达叠加?

如何从图像叠加层创建 geojson 文件?

使用 Swift 的 MKPolygon(调用中缺少参数“interiorPolygons”的参数)

如何以编程方式为处于触摸状态的 UIButton 创建灰色叠加层?

如何从屏幕截图中排除叠加层?

如何通过叠加层检测谷歌地图上的点击事件?