我发现区分 MKPolygons 的唯一方法是使用 MKPolygon.version(Int: Int) 类型属性。我可以将其设置为 1、2、3 等,并给每个颜色一个不同的颜色(例如)。我想扩展 MKPolygon 以添加标签,但 Swift 扩展无法添加存储属性。我不习惯使用 MKPolygon.version(我应该这样吗?)。有没有更好的办法?
问问题
895 次
2 回答
3
子类化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 之间来回切换,因此某些函数声明可能不匹配)
于 2016-08-15T15:10:15.687 回答
1
嘿,我知道这是不久前的事了,但对于其他想知道的人来说,你完全不需要子类化 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
}
}
}
请注意,如果您删除所有多边形并重新创建它们,您应该重新初始化字典。
于 2019-03-11T17:44:21.283 回答