我有一个显示来自本地数据库的磁贴的MKTileOverlay的MKMapView。它运行良好。
然后我使用MKDirections获得两个坐标之间的方向,并像这样绘制路线:
MKRoute *route = response.routes.lastObject;
MKPolyline *polyline = route.polyline;
// Draw path on overlay
[self.mapView insertOverlay:polyline aboveOverlay:self.tileOverlay];但当我放大看到这条线时,它看起来没有磁贴背景(正常情况下是从MKTileOverlay (存储到self.tileOverlay中)加载的)。为了看得更清楚,我加入了一张图片。
我还编写了下面的代码来渲染覆盖:
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
if ([overlay isKindOfClass:[MKTileOverlay class]]) {
return [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay];
}
else if ([overlay isKindOfClass:[MKPolyline class]]) {
MKPolylineRenderer *lineView = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
lineView.strokeColor = [UIColor greenColor];
lineView.lineWidth = 3;
return lineView;
}
return nil;
}这就像渲染隐藏从MKTileOverlay加载的磁贴的线的“磁贴”。我如何:
MKPolyline覆盖必须是透明的?截图:
See the tile with line has no background anymore http://sigmanet.ch/tmp/screen.png
发布于 2015-01-13 20:25:31
经过几天的工作,这是我自己的解决方案。
扩展MKPolylineRenderer并添加对MKTileOverlayRenderer的引用。让我们将这个新类命名为MCPolylineRenderer。
在这个类中,覆盖这两个方法:
- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {
// Draw path only if tile render has a tile
if ([self.tileRenderRef canDrawMapRect:mapRect zoomScale:zoomScale]) {
[super drawMapRect:mapRect zoomScale:zoomScale inContext:context];
}
}
- (BOOL)canDrawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale {
// We can draw path only if tile render can also
return [self.tileRenderRef canDrawMapRect:mapRect zoomScale:zoomScale];
}现在,在mapView:renderedForOverlay方法中,替换
MKPolylineRenderer *lineView = [[MKPolylineRenderer alloc] initWithOverlay:overlay]; 使用
MCPolylineRenderer *lineView = [[MCPolylineRenderer alloc] initWithPolyline:overlay];
lineView.tileRenderRef = self.tileRender;此外,您还需要确保当没有要呈现的内容时,loadTileAtPath:result:方法不会生成平铺(比如"tile found“图像)。
这段代码的效果是,当没有要渲染的背景瓦片时,也不会绘制路径。
发布于 2017-08-17 23:19:45
你必须创建MKPolylineRenderer的子类来同步渲染器的绘制能力。
import Foundation
import MapKit
class MyPolylineRenderer: MKPolylineRenderer {
var tileRenderer: MKTileOverlayRenderer?
override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) {
if (tileRenderer?.canDraw(mapRect, zoomScale: zoomScale) ?? true) {
super.draw(mapRect, zoomScale: zoomScale, in: context)
}
}
override func canDraw(_ mapRect: MKMapRect, zoomScale: MKZoomScale) -> Bool {
return tileRenderer?.canDraw(mapRect, zoomScale: zoomScale) ?? super.canDraw(mapRect, zoomScale: zoomScale)
}
}然后在MKMapViewDelegate中,保留对tileRenderer的引用并实现rendererForOverlay:
var tileRenderer: MKTileOverlayRenderer?
public func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if let polyline = overlay as? MKPolyline {
let lineRenderer = NXPolylineRenderer(overlay: overlay)
lineRenderer.tileRenderer = tileRenderer
// Configure your polyline overlay renderer here...
return lineRenderer;
}
if let tileOverlay = overlay as? MKTileOverlay {
if tileRenderer == nil || tileRenderer.overlay != overlay {
tileRenderer = MKTileOverlayRenderer(overlay: overlay)
}
return tileRenderer
}
return MKOverlayRenderer(overlay: overlay)
}这个想法的所有功劳都归功于@Jonathan,我只是发布了一个快速准备为新手复制/粘贴代码的帖子。
https://stackoverflow.com/questions/27864248
复制相似问题