MKOverlayPathView需要drawMapRect吗?

时间:2013-05-21 13:19:55

标签: ios mkmapview mapkit mkoverlay

我有一些不一致的修改Breadcrumb示例,让CrumbPathView从MKOverlayPathView(就像它应该的那样)子类化,而不是从MKOverlayView子类化。

麻烦的是,文档在说明如何实现这两个方面的差异方面是有限的。对于MKOverlayPathView的子类,建议使用:

- createPath
- applyStrokePropertiesToContext:atZoomScale:
- strokePath:inContext:

但是这取代了drawMapRect,还是除了?如果它是另外的话似乎没什么意义,因为两者都将用于类似的实现。但是使用它而不是drawMapRect,会使线条断然并破碎。

努力寻找任何现实世界的子类化MKOverlayPathView的例子......有什么意义吗?

UPDATE - 从drawMapRect修改代码到应该起作用的代码:

- (void)createPath
{
    CrumbPath *crumbs = (CrumbPath *)(self.overlay);

    CGMutablePathRef newPath = [self createPathForPoints:crumbs.points
                                    pointCount:crumbs.pointCount];

    if (newPath != nil) {
        CGPathAddPath(newPath, NULL, self.path);        
        [self setPath:newPath];
    }

    CGPathRelease(newPath);
}


- (void)applyStrokePropertiesToContext:(CGContextRef)context atZoomScale:(MKZoomScale)zoomScale
{
    CGContextSetStrokeColorWithColor(context, [[UIColor greenColor] CGColor]);

    CGFloat lineWidth = MKRoadWidthAtZoomScale(zoomScale);
    CGContextSetLineWidth(context, lineWidth);

    CGContextSetLineJoin(context, kCGLineJoinRound);
    CGContextSetLineCap(context, kCGLineCapRound);
}


- (void)strokePath:(CGPathRef)path inContext:(CGContextRef)context
{
    CGContextAddPath(context, path);
    CGContextStrokePath(context);

    [self setPath:path];
}

这会绘制一条初始行,但无法继续该行...它不会添加路径。我已经确认在每个新位置都会调用applyStrokePropertiesToContext和strokePath。

以下是结果的虚线的截图(它为createPath绘制,但之后没有绘制):

Breadcrumb example with createPath instead of drawMapRect

这是当createPath包含drawMapRect时发生的“波涛汹涌”路径的屏幕截图:

Broken map path

1 个答案:

答案 0 :(得分:0)

没有看到你猜测的更多代码,但这里有。

我怀疑路径被分成段,A-> B,C-> D,E-> F而不是具有A,B,C,D,E和F点的路径。确定我们需要查看self.overlay发生了什么以及它是否在任何时候被重置。

strokePath中,您将self.path设置为正在被抚摸的那个。我怀疑这是一个好主意,因为抚摸可能在任何时候发生,就像viewForAnnotations

至于波动性,它可能是Apple的副作用或边界计算不良。如果您的喜欢在Apple用来覆盖地图的瓷砖边界附近结束,那么它可能只会提示地图绘制该线所在的地图。但是您的笔触宽度会延伸到未绘制的相邻图块中。我再次猜测,但你可以通过将“Queen St W”中的W北部的点移动到南部,或者通过增加行程宽度并查看截止线是否保持在同一位置来测试地理上。