我正在开发一款需要不同颜色叠加层的应用,用于"交付区域"基本上我所做的就是根据我需要的颜色继承MKPolygon。
class YellowPolygon: MKPolygon {
}
class BluePolygon: MKPolygon {
}
class GreenPolygon: MKPolygon {
}
class PurplePolygon: MKPolygon {
}
class OrangePolygon: MKPolygon {
}
完成此操作后,我添加了类似
的类func addPolygon() {
let polygon1 = YellowPolygon(coordinates: coordArray[0], count: coordArray[0].count)
print(coordArray[0])
let polygon2 = BluePolygon(coordinates: coordArray[1], count: coordArray[1].count)
print(coordArray[1])
let polygon3 = GreenPolygon(coordinates: coordArray[2], count: coordArray[2].count)
print(coordArray[2])
let polygon4 = PurplePolygon(coordinates: coordArray[3], count: coordArray[3].count)
print(coordArray[3])
polygon1.title = "Narvarte1"
polygon2.title = "Escandón"
polygon3.title = "Narvarte2"
polygon4.title = "Zona Roma Norte"
poly1 = polygon1
poly2 = polygon2
poly3 = polygon3
poly4 = polygon4
mapView.add(polygon1)
mapView.add(polygon2)
mapView.add(polygon3)
mapView.add(polygon4)
}
我的叠加方法渲染器如下所示:
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let yellowCustom = UIColor(red: 255/255, green: 255/255, blue: 0/255, alpha: 1.0)
let blueCustom = UIColor(red: 1/255, green: 116/255, blue: 223/255, alpha: 1.0)
let greenCustom = UIColor(red: 95/255, green: 180/255, blue: 4/255, alpha: 1.0)
let purpleCustom = UIColor(red: 172/255, green: 88/255, blue: 250/255, alpha: 1.0)
let orangeCustom = UIColor(red: 255/255, green: 128/255, blue: 0/255, alpha: 1.0)
loadRutaView()
if overlay is MKPolyline {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = UIColor.yellow
renderer.lineWidth = 0
return renderer
} else if overlay is YellowPolygon {
let renderer = MKPolygonRenderer(polygon: overlay as! MKPolygon)
let currentMapPoint: MKMapPoint = MKMapPointForCoordinate(updatedUserLocation!)
let polygonViewPoint: CGPoint = renderer.point(for: currentMapPoint)
print(polygonViewPoint)
if renderer.path.contains(polygonViewPoint) {
print("Dentro de zona 1 (Amarilla)")
enRuta = true
loadRutaView()
self.sinRutaView.isHidden = true
self.rutaView.isHidden = false
self.zonasLabel.text = rutas[0].zona
self.diaLabel.text = rutas[0].dias
self.fechaLabel.text = rutas[0].proxDia
self.horarioLabel.text = rutas[0].hora
rutaSelecta = rutas[0]
} else {
loadRutaView()
print("fuera de la zona 1 (Amarilla)")
}
renderer.fillColor = yellowCustom.withAlphaComponent(0.5)
renderer.strokeColor = yellowCustom
renderer.lineWidth = 1
return renderer
} else if overlay is BluePolygon {
let renderer = MKPolygonRenderer(polygon: overlay as! MKPolygon)
let currentMapPoint: MKMapPoint = MKMapPointForCoordinate(updatedUserLocation!)
let polygonViewPoint: CGPoint = renderer.point(for: currentMapPoint)
print(polygonViewPoint)
if renderer.path.contains(polygonViewPoint) {
print("Dentro de zona 2 (Azul)")
enRuta = true
loadRutaView()
self.zonasLabel.text = rutas[1].zona
self.diaLabel.text = rutas[1].dias
self.fechaLabel.text = rutas[1].proxDia
self.horarioLabel.text = rutas[1].hora
rutaSelecta = rutas[1]
} else {
loadRutaView()
print("Fuera de la zona 2 (Azul)")
}
renderer.fillColor = blueCustom.withAlphaComponent(0.5)
renderer.strokeColor = blueCustom
renderer.lineWidth = 1
return renderer
} else if overlay is PurplePolygon {
let renderer = MKPolygonRenderer(polygon: overlay as! MKPolygon)
let currentMapPoint: MKMapPoint = MKMapPointForCoordinate(updatedUserLocation!)
let polygonViewPoint: CGPoint = renderer.point(for: currentMapPoint)
print(polygonViewPoint)
if renderer.path.contains(polygonViewPoint) {
print("Dentro de zona 3 (Morada)")
enRuta = true
loadRutaView()
self.zonasLabel.text = rutas[2].zona
self.diaLabel.text = rutas[2].dias
self.fechaLabel.text = rutas[2].proxDia
self.horarioLabel.text = rutas[2].hora
rutaSelecta = rutas[2]
} else {
print("Fuera de la zona 3 (Morada")
loadRutaView()
}
renderer.fillColor = purpleCustom.withAlphaComponent(0.5)
renderer.strokeColor = purpleCustom
renderer.lineWidth = 1
return renderer
} else if overlay is GreenPolygon {
let renderer = MKPolygonRenderer(polygon: overlay as! MKPolygon)
let currentMapPoint: MKMapPoint = MKMapPointForCoordinate(updatedUserLocation!)
let polygonViewPoint: CGPoint = renderer.point(for: currentMapPoint)
print(polygonViewPoint)
if renderer.path.contains(polygonViewPoint) {
print("Dentro de zona 4 (Verde)")
enRuta = true
loadRutaView()
self.zonasLabel.text = rutas[3].zona
self.diaLabel.text = rutas[3].dias
self.fechaLabel.text = rutas[3].proxDia
self.horarioLabel.text = rutas[3].hora
rutaSelecta = rutas[3]
} else {
loadRutaView()
print("Fuera de la zona 4 (Verde)")
}
renderer.fillColor = greenCustom.withAlphaComponent(0.5)
renderer.strokeColor = greenCustom
renderer.lineWidth = 1
return renderer
} else if overlay is OrangePolygon {
let renderer = MKPolygonRenderer(polygon: overlay as! MKPolygon)
let currentMapPoint: MKMapPoint = MKMapPointForCoordinate(updatedUserLocation!)
let polygonViewPoint: CGPoint = renderer.point(for: currentMapPoint)
print(polygonViewPoint)
if renderer.path.contains(polygonViewPoint) {
print("Dentro de zona 5 (Naranja)")
enRuta = true
loadRutaView()
self.zonasLabel.text = rutas[4].zona
self.diaLabel.text = rutas[4].dias
self.fechaLabel.text = rutas[4].proxDia
self.horarioLabel.text = rutas[4].hora
rutaSelecta = rutas[0]
} else {
loadRutaView()
print("Fuera de la zona 5 (Naranja)")
}
renderer.fillColor = orangeCustom.withAlphaComponent(0.5)
renderer.strokeColor = orangeCustom
renderer.lineWidth = 1
return renderer
}
return MKOverlayRenderer()
}
代码有效,但是当我离开这个视图时,这些多边形使用的内存和mapview都没有被释放。 (当我第一次访问这个视图时,我得到了从68mb到263mb的峰值,如果我离开并返回从263mb到356.5mb,如果我再次这样做则从356.5mb变为453.8mb,依此类推。)
任何可能的解决方法? (我绝对需要有不同颜色的mkpolygons,因为客户想要这个)。
谢谢:)