我在修改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,但之后没有绘制):
这是当createPath包含drawMapRect时发生的“断断续续”路径的屏幕截图:
最佳答案
我猜没有看到更多的代码,但这是可行的。
我怀疑路径被细分为A-> B,C-> D,E-> F,而不是具有点A,B,C,D,E和F的路径。为确保这一点,我们会需要查看self.overlay
发生了什么以及是否随时被重置。
在strokePath
中,将self.path
设置为被描边的那一种。我怀疑这是个好主意,因为像viewForAnnotations
一样,笔触可能随时发生。
至于断断续续,这可能是副作用,或是苹果方面的边界计算不佳。如果您的喜欢结束于Apple用来覆盖地图的图块的边界附近,则可能只会提示地图绘制线条所在的图块。但是您的笔触宽度会延伸到尚未绘制的相邻图块中。我又在猜测,但是您可以通过将“Queen St W”中W的北边向南移动一小部分,或者通过增加笔划宽度并查看截止线是否停留在同一位置来进行测试在地理上。
关于ios - MKOverlayPathView是否需要drawMapRect?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16671119/