- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我构建了一个自定义 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
的子类,则 fillColor
是 UIColor
,而不是 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
也很奇怪。您正在调用一些自定义初始化方法(这很好),但您正在传递 overlay
和 currentPolygon
。但是 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/
在我的 MKOverlayView 中,我在绘制传递给 drawMapRect:mapRect:zoomScale:inContext 的 MKMapRect 之外的区域时遇到问题派生类。我试图为集合
我正尝试在我的 map View 上绘制圆圈,但正如我所注意到的 - 方法 (void)drawMapRect 已被弃用。有什么新东西或任何替代品吗?谢谢。 最佳答案 如 the documentat
我在 map 上有很多长折线。我想优化他们的绘图,因为在几千个点上,折线的绘制速度非常慢。 我的 drawMapRect 看起来像这样: - for each polyline segment - v
我在修改 Breadcrumb 示例时遇到了一些不一致之处,以使 CrumbPathView 从 MKOverlayPathView 子类化(就像它应该的那样),而不是从 MKOverlayView
我重写了 .m 文件中的 drawMapRect 方法,但重写方法中的某些代码行似乎给了我错误,我不确定如何解决。我确保将 mkmapview 委托(delegate)设置为 self,导入了所有正确
我正在使用自定义 MKOverlay/MKOverlayView 用我自己的异步加载的图 block 完全覆盖 Google basemap 。当我收到对覆盖 View 的 canDrawMapRec
我构建了一个自定义 MKOverlayRenderer 以构建多边形、应用混合模式,然后将它们添加到 map View 。在我的 drawMapRect 函数中,我使用 CGPoints 数组来构建多
我有这个功能: - (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContext
我是一名优秀的程序员,十分优秀!