iPhone - 将UIBezierPath复制到CGPath并呈现为原始版本

时间:2011-06-11 04:35:30

标签: iphone quartz-graphics uibezierpath

我创建了一个复杂的UIBezierPath,它由几个路径段组成,包括实线,虚线,线条,颜色,弧等。所以我有了这个,现在我想把它呈现给CGContext。

因此,我使用

将其转换为CGPathReference
CGPathRef cgPath = CGPathCreateCopy(aBezierPath.CGPath);

问题在于:理论上,如果我想在CGContext上绘制路径,我必须为每个需要不同的段定义笔划宽度,颜色,线条样式,混合模式等,但是我已创建的UIBezierPath包含所有这些信息。

所以,我想知道是否有办法在CGContext中“标记”CGPath,因此它将标有所有原始信息?

感谢。

1 个答案:

答案 0 :(得分:6)

DR,你是对的:这很混乱!

但我认为汤姆是正确的,只需使用[aBezierPath stroke]。

所以,它会是这样的:

REF 是您建立的(CGContextRef)。

YOURBEZIERPATH 是(UIBezierPath *)。

你不可避免地要处理“颠倒”问题,所以:

UIGraphicsPushContext(REF);
CGContextSaveGState(REF);
CGContextTranslateCTM(REF, 0, the height*);
CGContextScaleCTM(REF, 1.0, -1.0);
[YOURBEZIERPATH stroke];
CGContextRestoreGState(REF);
UIGraphicsPopContext();

就是这样。

重新您的评论我有一系列UIBezierPaths。每个bezier都有自己的风格和颜色。

这有帮助吗? ...用for循环替换一个“笔画”调用:

UIGraphicsPushContext(REF);
CGContextSaveGState(REF);
CGContextTranslateCTM(REF, 0, the height*);
CGContextScaleCTM(REF, 1.0, -1.0);

for each of YOURBEZIERPATH in your array...
    {
    CGContextSaveGState(REF);
    [YOURBEZIERPATH stroke];
    CGContextRestoreGState(REF);
    }

CGContextRestoreGState(REF);
UIGraphicsPopContext();

您实际上不需要使用aBezierPath.CGPath或其副本。

再次,你是对的,它是非常令人困惑的,UI和CG的两个世界!!


* 高度:通常类似于self.frame.size.height。我只是将其包含在将来寻找一般示例代码的任何人中。