iPhone - 将 UIBezierPath 复制到 CGPath 并渲染为原始路径

发布于 2024-11-14 17:36:12 字数 389 浏览 4 评论 0原文

我创建了一个复杂的 UIBezierPath,它由多个路径段、实线、虚线、线条、颜色、弧线等组成。所以我有了这个,现在我想将其渲染到 CGContext。

因此,我将其转换为 CGPathReference 使用

CGPathRef cgPath = CGPathCreateCopy(aBezierPath.CGPath);

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

所以,我想知道是否有一种方法可以像在 CGContext 上一样“标记”CGPath,这样它就会被标记所有原始信息?

谢谢。

I have created a complex UIBezierPath that is composed of several path segments, solid, dashed, lines, colors, arcs, etc. So I have this and now I want to render it to a CGContext.

So, I convert it to a CGPathReference using

CGPathRef cgPath = CGPathCreateCopy(aBezierPath.CGPath);

The problem is this: in theory, if I want to draw a path on a CGContext, I have to define the stroke width, color, line style, blending mode, etc. for each segment that needs to be different, but the UIBezierPath I have already created contains all this information.

So, I wonder if there is a way to just to "stamp" the CGPath as it is on the CGContext, so it will be stamped with all the original information?

thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寄离 2024-11-21 17:36:12

博士,你是对的:这非常令人困惑!

但我认为Tom是正确的,只需使用[aBezierPath描边]即可。

因此,它会是这样的:

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 数组。每个贝塞尔曲线都有自己的风格和颜色。

这有帮助吗? ...用 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。我只是为将来寻找通用示例代码的人提供此内容。

DR, you're right: it is very confusing!

But I think Tom is correct, just use [aBezierPath stroke].

So, it would be something like this:

REF is a (CGContextRef) which you have built.

YOURBEZIERPATH is a (UIBezierPath*).

Inevitably you have to deal with the "drawing upside down" issue, so:

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

So that's it.

Re your comment below: I have an array of UIBezierPaths. Each bezier has its own style and color.

Does this help? ... Replace the one "stroke" call, with a for loop:

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();

You actually do not need to bother using aBezierPath.CGPath, or, a copy thereof.

Again you are right, it is very confusing, the two worlds of UI and CG !!


*the height: often something like self.frame.size.height. I just include this for anyone looking for general example code in the future.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文