gpt4 book ai didi

swift - 更改现有的 MKOverlays - 如何确定要更改的内容?

转载 作者:行者123 更新时间:2023-11-28 07:23:50 24 4
gpt4 key购买 nike

我正在尝试更改 map 上现有 MKOverlay 的颜色。

我添加了几个 MKPolygons 作为 mapView 的独特叠加层。在渲染它们时,叠加层的颜色由 mapView rendererFor 函数应用。
我想定期更改现有覆盖层的颜色;理想情况下无需删除所有内容并重新添加。我有处理颜色变化的代码,但我不知道如何识别不同的叠加层,而不是通过它们的类型(MKPolygon、MKCircle)——但在我的情况下,所有叠加层都是 MKPolygon,所以执行代码只会改变所有。

  • 在使用 addOverlay 和操作标题之前,我曾尝试将 MKPolygon 转换为 MKOverlay,但标题是“仅获取”
  • 我曾尝试子类化 MKPolygon,但我的阅读表明这在 Swift 中很糟糕。

我像这样添加叠加层。

  var shapeNW:MKMapPoint = MKMapPoint( CLLocationCoordinate2D(latitude: 48.313319, longitude: -124.109715))
var shapeNE:MKMapPoint = MKMapPoint( CLLocationCoordinate2D(latitude: 48.313312, longitude: -124.108695))
var shapeSW:MKMapPoint = MKMapPoint( CLLocationCoordinate2D(latitude: 48.312661, longitude: -124.109767))
var shapeSE:MKMapPoint = MKMapPoint( CLLocationCoordinate2D(latitude: 48.312626, longitude: -124.108679))


var myShapePoints:[MKMapPoint] = [shapeNW,shapeNE,shapeSE,shapeSW]
// addAnItemToMap(title: "Circle", locationName: "CircleName", type: "SS", coordinate: feiLocation, horizontalAccuracy: 20)
var myShape:MKPolygon = MKPolygon(points: myShapePoints, count: 4)
mapView.addOverlay(myShape)

这是我用来在创建后更改颜色的函数。但很明显,此函数会更改所有项目的颜色,因为它无法识别要更改的叠加层。这是我的问题,我想确定具体的叠加层并对其进行更改。

func changeColor(identifier: String) {
let overlays = self.mapView.overlays
let duration:TimeInterval = 5.0

for overlay in overlays {
if identifier == "on"{
let renderer = mapView.renderer(for: overlay) as! MKPolygonRenderer
DispatchQueue.main.async{
renderer.alpha = 1.0
renderer.fillColor = UIColor.blue
}
}

else {
let renderer = mapView.renderer(for: overlay) as! MKPolygonRenderer
DispatchQueue.main.async{
renderer.alpha = 0.0
}
}
}
}

最佳答案

你可以继承MKPolygon:

class CustomPolygon: MKPolygon {
var identifier: String? = nil
}

然后你可以相应地配置你的渲染器:

func configureColor(of renderer: MKPolygonRenderer, for overlay: MKOverlay) {
let baseColor: UIColor
if let polygon = overlay as? CustomPolygon, polygon.identifier == "on" {
baseColor = .cyan
} else {
baseColor = .red
}
renderer.strokeColor = baseColor.withAlphaComponent(0.75)
renderer.fillColor = baseColor.withAlphaComponent(0.25)
}

然后你的主 renderer(for:) 可以使用它:

extension ViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolygonRenderer(overlay: overlay)
renderer.lineWidth = 5
configureColor(of: renderer, for: overlay)
return renderer
}
}

您的更新例程可以:

func updateColors() {
for overlay in mapView.overlays {
if let renderer = mapView.renderer(for: overlay) as? MKPolygonRenderer {
configureColor(of: renderer, for: overlay)
}
}
}

就我个人而言,与其让标识符不是 "on" 的覆盖层的 alpha 为 0,不如从 map 中删除这些覆盖层,然后您就不需要不必处理这些。

关于swift - 更改现有的 MKOverlays - 如何确定要更改的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57211403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com