Единственный способ, который я обнаружил, чтобы различать MKPolygon, — это использовать свойство типа MKPolygon.version(Int: Int). Я могу установить это на 1,2,3 и т. д. и дать каждому свой цвет (например). Я хотел расширить MKPolygon, чтобы добавить тег, но расширения Swift не могут добавлять сохраненные свойства. Мне неудобно использовать MKPolygon.version (а стоит ли?). Есть ли способ лучше?
Как мне отличить несколько разных оверлеев MKPolygon, чтобы я мог присвоить каждому из них разные свойства?
Ответы (2)
Подкласс 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 для достижения этого. Я пытался это сделать и столкнулся с некоторыми проблемами. Я уверен, что их можно было решить так или иначе, но я решил сделать словарь типа [Int : String]. Когда вы изначально создаете многоугольник, используйте его hashValue в качестве ключа словаря и вставьте любой уникальный идентификатор, который вы хотите (вы также можете использовать [Int: Int] или любое количество других типов). Затем позже, когда вам нужно выяснить, какой это полигон, просто верните это хэш-значение обратно в словарь, и вуаля, у вас есть свой уникальный идентификатор. Если это не ясно:
//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
}
}
}
Обратите внимание, что если вы удалите все полигоны и создадите их заново, вы должны повторно инициализировать словарь.