我正在开发一个需要不同颜色覆盖“交付区域”的应用程序,所以基本上我所做的就是根据我需要的颜色对 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()
}
代码有效,但是当我离开这个视图时,这些多边形和地图视图使用的内存没有被释放。(当我第一次访问此视图时,我会从 68mb 增加到 263mb,如果我离开然后回来,如果我再次访问,它会从 263mb 变为 356.5mb,它会从 356.5mb 变为 453.8mb,依此类推)。
任何可能的解决方法?(我绝对需要不同颜色的 mkpolygons,因为客户想要这个)。
谢谢 :)