使用Core Graphics绘制路径的问题 - iPhone

时间:2009-10-10 08:12:51

标签: iphone path core-graphics quartz-graphics vector-graphics

我正在尝试在我的应用中绘制地图注释 - 非常像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);

2 个答案:

答案 0 :(得分:4)

首先,在PostScript(以及AppKit绘图和Core Graphics等衍生产品)中,您通常会绘制逆时针路径,尤其是在填充时。顺时针方向的路径就像你在这里显示的路径一样,如果你想在外面填充

,你就会得到它。

其次,我假设这个背景来自左上角(正y下降),而不是左下角(正y上升)。

离开第一个弧时,当前点位于指针底部的死点。将arct命令(CGContextAddArcToPoint)的第二个点设置为指针的第一个基点是否更有意义?除了更正确之外,你只需要将两个点传递给CGContextAddLines

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

我将开始在指针的右基点绘制,然后将线条绘制到接下来的两个点(尖端和左侧基点,按此顺序),然​​后以(逆时针)连续绘制所有四个弧,然后{ {1}}(一次)。这应该稍微简单一些,也是正确的。

答案 1 :(得分:0)

因此无论输入什么值,CGContextMoveToPoint都无效,无论是否有CGContextPathBegin。使用指针箭头角处的线开始路径允许我指定起始点。感谢Peter帮助我理解它,以及如何简化路径。