首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MapKit :添加MKPolyline隐藏MKTileOverlay

MapKit :添加MKPolyline隐藏MKTileOverlay
EN

Stack Overflow用户
提问于 2015-01-09 23:48:33
回答 2查看 873关注 0票数 3

我有一个显示来自本地数据库的磁贴的MKTileOverlayMKMapView。它运行良好。

然后我使用MKDirections获得两个坐标之间的方向,并像这样绘制路线:

代码语言:javascript
复制
MKRoute *route = response.routes.lastObject;
MKPolyline *polyline = route.polyline;

// Draw path on overlay
[self.mapView insertOverlay:polyline aboveOverlay:self.tileOverlay];

但当我放大看到这条线时,它看起来没有磁贴背景(正常情况下是从MKTileOverlay (存储到self.tileOverlay中)加载的)。为了看得更清楚,我加入了一张图片。

我还编写了下面的代码来渲染覆盖:

代码语言:javascript
复制
- (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

EN

回答 2

Stack Overflow用户

发布于 2015-01-13 20:25:31

经过几天的工作,这是我自己的解决方案。

扩展MKPolylineRenderer并添加对MKTileOverlayRenderer的引用。让我们将这个新类命名为MCPolylineRenderer

在这个类中,覆盖这两个方法:

代码语言:javascript
复制
- (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方法中,替换

代码语言:javascript
复制
MKPolylineRenderer *lineView = [[MKPolylineRenderer alloc] initWithOverlay:overlay]; 

使用

代码语言:javascript
复制
MCPolylineRenderer *lineView = [[MCPolylineRenderer alloc] initWithPolyline:overlay];
lineView.tileRenderRef = self.tileRender;

此外,您还需要确保当没有要呈现的内容时,loadTileAtPath:result:方法不会生成平铺(比如"tile found“图像)。

这段代码的效果是,当没有要渲染的背景瓦片时,也不会绘制路径。

票数 5
EN

Stack Overflow用户

发布于 2017-08-17 23:19:45

你必须创建MKPolylineRenderer的子类来同步渲染器的绘制能力。

代码语言:javascript
复制
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

代码语言:javascript
复制
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,我只是发布了一个快速准备为新手复制/粘贴代码的帖子。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27864248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档