0

アプリで地図の注釈を描画しようとしています。MapKitのMKAnnotationViewと非常によく似ていますが、mapkitはありません。

ビューアウトラインのパスの順序に問題があり、理解できません。

結果の画像:

http://img504.imageshack.us/img504/5458/screenshot20091010at703.png

コード:

CGFloat minx = CGRectGetMinX(currentBounds);
CGFloat midx = CGRectGetMidX(currentBounds);
CGFloat maxx = CGRectGetMaxX(currentBounds);
CGFloat miny = CGRectGetMinY(currentBounds)+10.0f;
CGFloat midy = CGRectGetMidY(currentBounds)+10.0f;
CGFloat maxy = CGRectGetMaxY(currentBounds)+10.0f;

CGContextBeginPath(currentContext);
CGContextMoveToPoint(currentContext, minx, miny+radius); //before top left arc
CGContextAddArcToPoint(currentContext, minx, miny, midx, miny, radius); //top left

CGPoint points1[] = {
CGPointMake(midx-10.0f, miny),
CGPointMake(midx, 0.0f), //tip of arrow
CGPointMake(midx+10.0f, miny),
};
CGContextAddLines(currentContext,  points1, 3);
CGContextAddArcToPoint(currentContext, maxx, miny, maxx, midy, radius); //top right
CGContextAddArcToPoint(currentContext, maxx, maxy, midx, maxy, radius); //bottom right
CGContextAddArcToPoint(currentContext, minx, maxy, minx, midy, radius); //bottom left
CGContextClosePath(currentContext);

CGContextClosePath(currentContext);
CGContextDrawPath(currentContext, kCGPathFillStroke);
//CGContextDrawPath(currentContext, kCGPathEOFillStroke);
4

2 に答える 2

4

まず、PostScript (および AppKit 描画や Core Graphics などの派生物) では、通常、特に塗りつぶしの際に、反時計回りのパスを描画します。ここに示すような時計回りのパスは、外側を塗りつぶしたい場合に描くものです。

第 2 に、このコンテキストは左下 (正の y が上がる) ではなく、左上 (正の y が下がる) に由来すると仮定しています。

最初の円弧から出ると、現在のポイントはポインターの下部の中心にあります。arctコマンド ( CGContextAddArcToPoint) の 2 番目のポイントをポインターの最初の基点として設定する方が理にかなっているのではないでしょうか? より正確であることに加えて、 に 2 つのポイントを渡すだけで済みますCGContextAddLines

パスを 2 回閉じるということですか。害はないと思いますが、余計です。

ポインターの右側の基点から描画を開始し、次の 2 つの点 (先端と左側の基点の順に) に線をプロットし、4 つの円弧すべてを (反時計回りに) 連続してプロットし、次にclosepath(1 回) プロットします。それは少し単純で正しいはずです。

于 2009-10-10T08:30:36.860 に答える
0

したがって、CGContextPathBeginの有無にかかわらず、入力された値に関係なく、CGContextMoveToPointは機能していませんでした。ポインタの矢印の角にある線でパスを開始すると、開始点を指定できました。私がそれを理解するのを手伝ってくれて、そしてパスを単純化する方法を教えてくれたピーターに感謝します。

于 2009-10-10T10:54:28.197 に答える