删除特定 mapView.overlay
removing specific mapView.overlay
我目前正在做一个涉及 mapView 的项目,该项目需要显示一条连接两点并围绕用户位置的圆。
我的代码是这样的:
self.mapView.delegate = self // on viewDidLoad
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
switch overlay {
case is MKCircle:
let circle = MKCircleRenderer(overlay: overlay)
circle.strokeColor = UIColor.blue
// circle.fillColor = UIColor(red: 0, green: 0, blue: 255, alpha: 0.1)
circle.fillColor = UIColor.blue
circle.lineWidth = 0.5
circle.alpha = 0.1
return circle
case is MKPolyline:
let polylineRenderer = MKPolylineRenderer(overlay: overlay)
polylineRenderer.strokeColor = UIColor.black
polylineRenderer.lineWidth = 2
return polylineRenderer
default:
return MKPolygonRenderer()
}
}
func createCircle(location: CLLocation){
let circle = MKCircle(center: location.coordinate, radius: 500 as CLLocationDistance)
self.mapView.add(circle)
}
func createPolyline() {
var coords = [CLLocationCoordinate2D]()
coords.append(point1)
coords.append(point2)
let polyline = MKPolyline(coordinates: coords, count: coords.count)
self.mapView.add(polyline)
}
createCircle() 和 createPolyline() 每当位置发生变化时都会被调用,这样它也会移动到用户所在的位置,我的问题是保留了以前的叠加层,而新的叠加层与它们重叠。我找到了删除叠加层的方法,
let overlays = mapView.overlays
mapView.removeOverlays(overlays)
但是这行代码去掉了所有的overlay,我只想去掉,比如之前的Circle Overlay。例如,无法找到一种方法来命名覆盖层,以便在删除时可以参考它。希望我能够很好地解释我的情况。
解决此问题的最佳方法是什么?谢谢!
您需要将原始 MKOverlay
对象存储在 属性 中,然后只需调用 remove
即可将其删除:
class MyViewController: UIViewController {
var circle: MKOverlay?
func createCircle(location: CLLocation){
self.removeCircle()
self.circle = MKCircle(center: location.coordinate, radius: 500 as CLLocationDistance)
self.mapView.add(circle!)
}
func removeCircle() {
if let circle = self.circle {
self.mapView.remove(circle)
self.circle = nil
}
}
}
您应该通过 属性 保留叠加层的参考。所以每次你创建一个新的叠加层(圆或折线)你必须删除旧的。您可以为每个叠加层创建多个属性,也可以为特定场景保留一组叠加层。我的意思是,如果在某些特定情况下你必须使用多个覆盖实例,你应该保留数组。总之,一切看具体情况!
我运行陷入同样的问题。如果你只想从 MKMapView 中删除一个特定的叠加层,你可以这样做:
// Get the all overlays from map view
if let overlays = mapView?.overlays {
for overlay in overlays {
// remove all MKPolyline-Overlays
if overlay is MKPolyline {
mapView?.removeOverlay(overlay)
}
}
}
我目前正在做一个涉及 mapView 的项目,该项目需要显示一条连接两点并围绕用户位置的圆。
我的代码是这样的:
self.mapView.delegate = self // on viewDidLoad
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
switch overlay {
case is MKCircle:
let circle = MKCircleRenderer(overlay: overlay)
circle.strokeColor = UIColor.blue
// circle.fillColor = UIColor(red: 0, green: 0, blue: 255, alpha: 0.1)
circle.fillColor = UIColor.blue
circle.lineWidth = 0.5
circle.alpha = 0.1
return circle
case is MKPolyline:
let polylineRenderer = MKPolylineRenderer(overlay: overlay)
polylineRenderer.strokeColor = UIColor.black
polylineRenderer.lineWidth = 2
return polylineRenderer
default:
return MKPolygonRenderer()
}
}
func createCircle(location: CLLocation){
let circle = MKCircle(center: location.coordinate, radius: 500 as CLLocationDistance)
self.mapView.add(circle)
}
func createPolyline() {
var coords = [CLLocationCoordinate2D]()
coords.append(point1)
coords.append(point2)
let polyline = MKPolyline(coordinates: coords, count: coords.count)
self.mapView.add(polyline)
}
createCircle() 和 createPolyline() 每当位置发生变化时都会被调用,这样它也会移动到用户所在的位置,我的问题是保留了以前的叠加层,而新的叠加层与它们重叠。我找到了删除叠加层的方法,
let overlays = mapView.overlays
mapView.removeOverlays(overlays)
但是这行代码去掉了所有的overlay,我只想去掉,比如之前的Circle Overlay。例如,无法找到一种方法来命名覆盖层,以便在删除时可以参考它。希望我能够很好地解释我的情况。
解决此问题的最佳方法是什么?谢谢!
您需要将原始 MKOverlay
对象存储在 属性 中,然后只需调用 remove
即可将其删除:
class MyViewController: UIViewController {
var circle: MKOverlay?
func createCircle(location: CLLocation){
self.removeCircle()
self.circle = MKCircle(center: location.coordinate, radius: 500 as CLLocationDistance)
self.mapView.add(circle!)
}
func removeCircle() {
if let circle = self.circle {
self.mapView.remove(circle)
self.circle = nil
}
}
}
您应该通过 属性 保留叠加层的参考。所以每次你创建一个新的叠加层(圆或折线)你必须删除旧的。您可以为每个叠加层创建多个属性,也可以为特定场景保留一组叠加层。我的意思是,如果在某些特定情况下你必须使用多个覆盖实例,你应该保留数组。总之,一切看具体情况!
我运行陷入同样的问题。如果你只想从 MKMapView 中删除一个特定的叠加层,你可以这样做:
// Get the all overlays from map view
if let overlays = mapView?.overlays {
for overlay in overlays {
// remove all MKPolyline-Overlays
if overlay is MKPolyline {
mapView?.removeOverlay(overlay)
}
}
}