パンくずリストの例を変更して、MKOverlayView からサブクラス化するのではなく、MKOverlayPathView からサブクラス化した CrumbPathView を (本来のように) 変更すると、いくつかの矛盾が生じます。
問題は、これら2つの実装方法の違いを説明するドキュメントが限られていることです。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 が含まれている場合に発生する「途切れ途切れ」のパスのスクリーンショットです。