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 等衍生产品)中,您通常会绘制逆时针路径,尤其是在填充时。如果你想在它外面填充,你会画一条像你在这里展示的那样的顺时针路径。

其次,我假设这个上下文起源于左上角(正 y 向下),而不是左下角(正 y 向上)。

从第一个弧线出来,当前点在指针底部的死点。arct将命令 ( CGContextAddArcToPoint) 的第二个点设置为指针的第一个基点不是更有意义吗?除了更正确之外,您只需将两点传递给CGContextAddLines.

你的意思是关闭路径两次?我不认为它会伤害任何东西,但它是多余的。

我将从指针的右基点开始绘制,然后将线绘制到接下来的两个点(尖端和左基点,按此顺序),然​​后(逆时针)连续绘制所有四个弧,然后closepath(一次)。那应该稍微简单一些,并且正确。

于 2009-10-10T08:30:36.860 回答
0

所以 CGContextMoveToPoint 不起作用,无论输入什么值,有或没有 CGContextPathBegin。以指针箭头角处的线开始路径允许我指定起点。感谢彼得帮助我理解它,以及如何简化路径。

于 2009-10-10T10:54:28.197 回答