我正在尝试在我的应用中绘制地图注释 - 非常像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);
答案 0 :(得分:4)
首先,在PostScript(以及AppKit绘图和Core Graphics等衍生产品)中,您通常会绘制逆时针路径,尤其是在填充时。顺时针方向的路径就像你在这里显示的路径一样,如果你想在外面填充
,你就会得到它。其次,我假设这个背景来自左上角(正y下降),而不是左下角(正y上升)。
离开第一个弧时,当前点位于指针底部的死点。将arct
命令(CGContextAddArcToPoint
)的第二个点设置为指针的第一个基点是否更有意义?除了更正确之外,你只需要将两个点传递给CGContextAddLines
。
你的意思是关闭路径两次?我不认为它会伤害任何东西,但这是多余的。
我将开始在指针的右基点绘制,然后将线条绘制到接下来的两个点(尖端和左侧基点,按此顺序),然后以(逆时针)连续绘制所有四个弧,然后{ {1}}(一次)。这应该稍微简单一些,也是正确的。
答案 1 :(得分:0)
因此无论输入什么值,CGContextMoveToPoint都无效,无论是否有CGContextPathBegin。使用指针箭头角处的线开始路径允许我指定起始点。感谢Peter帮助我理解它,以及如何简化路径。