【问题标题】:Problem with drawing paths with Core Graphics - iPhone使用 Core Graphics 绘制路径的问题 - iPhone
【发布时间】:2009-10-10 08:12:51
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    首先,在 PostScript(以及 AppKit 绘图和 Core Graphics 等衍生产品)中,您通常会绘制逆时针路径,尤其是在填充时。如果您想在外部填充它,您会绘制一条像您在此处展示的那样的顺时针路径。

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

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

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

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

    【讨论】:

    • CGContextMoveToPoint(currentContext, midx+10.0f, miny); CGPoint points[] = { CGPointMake(midx, 0.0f), //point CGPointMake(midx-10.0f, miny), }; CGContextAddLines(currentContext, points, 2); CGContextAddArcToPoint(currentContext, minx, miny, minx, midy, radius); //TL CGContextAddArcToPoint(currentContext, minx, maxy, midx, maxy, radius); //BL CGContextAddArcToPoint(currentContext, maxx, maxy, maxx, midy, radius); //BR CGContextAddArcToPoint(currentContext, maxx, miny, midx, miny, radius); //TR 关闭路径,绘制 img36.imageshack.us/img36/92/screenshot20091010at816.png
    • 彼得,感谢您的提示。请原谅该评论的简短程度 - 有字符限制。现在看来起点不行了?
    • 该代码绝对应该按预期工作。我建议提交一个关于 closepath 返回第一个 lineto 而不是 moveto 的错误。 bugreport.apple.com
    • 顺便说一句,这似乎与影响原始代码的问题相同:左下角弧后的closepath 跳转到第一个lineto(左基点),甚至跳过顶部-左弧。
    • 更新:这不是错误。引用 CGContextAddLines 的文档:“第一个点是指定初始起点的数组。”所以这是隐含的第二次行动。去掉显式的 moveto,并将指针的所有三个点都传递给 CGContextAddLines。
    【解决方案2】:

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

    【讨论】:

    • 与其说它不起作用,不如说 CGContextAddToLines 做了一个隐含的moveto,它取消了你的显式。请参阅我对我的答案的最新评论。
    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多