gpt4 book ai didi

ios - 自定义 MKOverlayRenderer drawMapRect 函数不绘制多边形

转载 作者:搜寻专家 更新时间:2023-10-31 22:46:19 25 4
gpt4 key购买 nike

我构建了一个自定义 MKOverlayRenderer 以构建多边形、应用混合模式,然后将它们添加到 map View 。在我的 drawMapRect 函数中,我使用 CGPoints 数组来构建多边形,并创建路径。

但是,在运行时,我的 map View 上没有任何显示。我最好的猜测是我在 drawMapRect 函数中创建多边形的顺序。非常感谢任何帮助或指导,谢谢!

override func drawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale, inContext context: CGContext) {

super.drawMapRect(mapRect, zoomScale: zoomScale, inContext: context)
CGContextSaveGState(context)
CGContextSetBlendMode(context, CGBlendMode.Exclusion)
CGContextSetFillColorWithColor(context, self.fillColor)
CGContextSetStrokeColorWithColor(context, UIColor.whiteColor().CGColor)
CGContextSetLineWidth(context, 1.0)

let point = MKMapPointForCoordinate(self.polygon.points[0])
CGContextMoveToPoint(context, CGFloat(point.x), CGFloat(point.y))
for i in 1..<self.polygon.points.count {
let point = polygon.points[i]
let p = MKMapPointForCoordinate(point)
CGContextAddLineToPoint(context, CGFloat(p.x), CGFloat(p.y))
}

CGContextClosePath(context)
CGContextDrawPath(context, CGPathDrawingMode.FillStroke)
CGContextRestoreGState(context)
}

这里是我的自定义覆盖渲染器的初始化位置:

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
if (overlay is MKPolygon) {
let polygonRenderer = MyCustomMapRenderer(overlay: overlay, fillColor: self.polyFactory!.getPolygonColor().CGColor, polygon: self.currentPolygon!)
return polygonRenderer
}
return MKOverlayRenderer()
}

最佳答案

一些观察:

  • 您正在获取 points,它已经是一个 MKMapPoint 数组(至少在 MKPolygonRenderer 中)并调用 MKMapPointForCoordinate。如果你想使用MKMapPointForCoordinate,你会传递给它coordinates,而不是points。也许您已经定义了自己的属性,但我可能会更改属性的名称以避免混淆。

  • 您需要使用pointForMapPoint 将 map 点转换为屏幕点。

  • 此外,您正在调用 CGContextSetFillColorWithColor,但将其传递给 fillColor。但假设您的类是 MKPolygonRenderer 的子类,则 fillColorUIColor,而不是 CGColor

  • 您似乎正在访问某些属性,points,但是 MKPolygonRenderer 没有 points 属性,而是 points() 方法。

综上所述,我什至不清楚您的代码是如何编译的。我怀疑您没有从 MKPolygonRenderer 继承子类,而是继承了 MKOverlayRenderer 然后自己实现了一堆属性?如果您子类化 MKPolygonRender,您可以免费获得所有多边形行为,只需实现 drawMapRect:

class MyCustomMapRenderer: MKPolygonRenderer {

override func drawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale, inContext context: CGContext) {
//super.drawMapRect(mapRect, zoomScale: zoomScale, inContext: context)

CGContextSaveGState(context)
CGContextSetBlendMode(context, CGBlendMode.Exclusion)
CGContextSetFillColorWithColor(context, fillColor!.CGColor)
CGContextSetStrokeColorWithColor(context, UIColor.whiteColor().CGColor)
CGContextSetLineWidth(context, 1.0)

if polygon.pointCount > 1 {
CGContextBeginPath(context)

let point = pointForMapPoint(polygon.points()[0])
CGContextMoveToPoint(context, CGFloat(point.x), CGFloat(point.y))
for i in 1 ..< polygon.pointCount {
let point = pointForMapPoint(polygon.points()[i])
CGContextAddLineToPoint(context, CGFloat(point.x), CGFloat(point.y))
}

CGContextClosePath(context)
CGContextDrawPath(context, CGPathDrawingMode.FillStroke)
}
CGContextRestoreGState(context)
}

}

顺便说一句,我们在这里可能会更复杂(检查点是否可见,确定在给定比例下渲染哪些点......即如果多边形具有数千个点并被缩放为 100x100 部分的观点,也许你不必渲染所有的点等)。请参阅 WWDC 2010 Customizing Maps with Overlays ,虽然过时了,但仍然具有相关性。

顺便说一句,您的 rendererForOverlay 也很奇怪。您正在调用一些自定义初始化方法(这很好),但您正在传递 overlaycurrentPolygon。但是 overlay 多边形,所以我不知道这个 currentPolygon 是什么。而且 rendererForOverlay 是无状态的,所以我不鼓励您引用某些属性,而只是采用传递给该方法的 overlay。这样,您可以拥有多个多边形,并让 map View 跟踪哪个是哪个。所以我会做类似的事情:

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
if let polygon = overlay as? MKPolygon {
let polygonRenderer = MyCustomMapRenderer(polygon: polygon)
polygonRenderer.fillColor = polyFactory!.getPolygonColor()
return polygonRenderer
}
fatalError("Unexpected overlay type")
}

关于ios - 自定义 MKOverlayRenderer drawMapRect 函数不绘制多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37473184/

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