2

我在修改 Breadcrumb 示例时遇到了一些不一致之处,以使 CrumbPathView 从 MKOverlayPathView 子类化(就像它应该的那样),而不是从 MKOverlayView 子类化。

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

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

但这是代替drawMapRect,还是补充?如果加上它似乎没有多大意义,因为两者都将用于类似的实现。但是使用它而不是 drawMapRect,会使线条变得断断续续。

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

更新 - 从 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 绘制,但之后没有绘制):

使用 createPath 而不是 drawMapRect 的面包屑示例

这是 createPath 中包含 drawMapRect 时发生的“断断续续”路径的屏幕截图:

破损的地图路径

4

1 回答 1

0

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

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

strokePath你设置self.path为被抚摸的那个。我怀疑这是一个好主意,因为抚摸可能随时发生,就像viewForAnnotations

至于断断续续,它可能是苹果的副作用或边界计算不佳。如果您喜欢在 Apple 用来覆盖地图的图块边界附近结束,它可能只会提示地图绘制线所在的图块。但是您的笔划宽度会延伸到尚未绘制的相邻图块中。我再次猜测,但您可以通过将“Queen St W”中 W 以北的点向南移动一小部分来测试这一点,或者通过增加笔划宽度并查看截止线是否保持在同一个地方地理上。

于 2013-05-27T07:55:40.453 回答