gpt4 book ai didi

cocoa - 如何在 Quartz 中用图案填充路径

转载 作者:行者123 更新时间:2023-12-03 17:54:18 24 4
gpt4 key购买 nike

我创建了一个 View ,并在我的绘制矩形方法中根据用户对 slider 的操作创建路径。使用标准颜色,一切正常并且看起来非常漂亮。我正在尝试遵循苹果的代码片段,该代码片段展示了如何在此链接中将图案绘制到矩形中: Apple Drawing Guide

该示例展示了如何使用所需的模式创建函数回调,然后调用附加方法来绘制矩形。如果我调用从我的矩形编写的代码,它会按照我的预期绘制我的图案,但是,我不想填充我的矩形,我想填充矩形中的指定路径。如果我将绘图方法中的调用从 CGContextFillRect 更改为 CGContextFillPath,则它不起作用。我确信我忽略了一些东西来修改此代码以使其执行我想要的操作。

我的回调模式是一个简单的棋盘:

代码:

// Call Back function for Graphics Pattern

#define PATTERN_SIZE 10

void patternSpec(void *info , CGContextRef pContext){

NSLog(@"patternSpec Callback Called");
CGFloat subUnit = PATTERN_SIZE / 2;

CGRect square1 = {{0,0}, {subUnit, subUnit}},
square2 = {{subUnit, subUnit}, {subUnit, subUnit}},
square3 = {{0 , subUnit}, {subUnit, subUnit}},
square4 = {{subUnit , 0}, {subUnit, subUnit}};


CGContextSetRGBFillColor(pContext, 1.0, 0.0, 0.0, 1.0 );
CGContextFillRect(pContext, square1);

CGContextSetRGBFillColor(pContext, 1.0, 0.0, 0.0, 1.0 );
CGContextFillRect(pContext, square2);

CGContextSetRGBFillColor(pContext, 0.0, 0.0, 0.0, 1.0 );
CGContextFillRect(pContext, square3);

CGContextSetRGBFillColor(pContext, 0.0, 0.0, 0.0, 1.0 );
CGContextFillRect(pContext, square4);

}

// Method that draws the pattern

static void drawPattern (CGContextRef myContext)
{
NSLog(@"drawPattern Called ");
CGPatternRef pattern;
CGColorSpaceRef patternSpace;
CGFloat alpha = 1.0;
//width, height;

static const CGPatternCallbacks callbacks = {0, &patternSpec, NULL};

CGContextSaveGState (myContext);
patternSpace = CGColorSpaceCreatePattern (NULL);// 6
CGContextSetFillColorSpace (myContext, patternSpace);// 7
CGColorSpaceRelease (patternSpace);// 8

pattern = CGPatternCreate (NULL,CGRectMake (0, 0, PATTERN_SIZE, PATTERN_SIZE),
CGAffineTransformIdentity, PATTERN_SIZE, PATTERN_SIZE,
kCGPatternTilingConstantSpacing true, &callbacks);

CGContextSetFillPattern (myContext, pattern, &alpha);// 17
CGPatternRelease (pattern);// 18
//CGContextFillRect(myContext, rect);
CGContextDrawPath(myContext, kCGPathFill);
CGContextRestoreGState (myContext);

}

这是我想调用例程的代码片段:

CGContextSetLineWidth(context, .7);
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);


// Standard non-inverted view scenario.
CGContextBeginPath(context);

CGContextMoveToPoint(context, 0.00 , bMargin);
CGContextAddLineToPoint(context, highPX - curveSP , bMargin);
[self addCurve:context startX:highPX startY:bMargin radius:bo curveSp:curveSP curveDir:FL_BL];

CGContextAddLineToPoint(context, highPX, ((h - tMargin) - curveSP) );
[self addCurve:context startX:highPX startY: (h - tMargin) radius:bo curveSp:curveSP curveDir:FL_TL];


CGContextAddLineToPoint(context, (lowPX - curveSP), (h - tMargin) );
[self addCurve:context startX: lowPX startY: (h - tMargin) radius:bo curveSp:curveSP curveDir:FL_TR];

CGContextAddLineToPoint(context, lowPX, (bMargin + curveSP) );
[self addCurve:context startX:lowPX startY: bMargin radius:bo curveSp:curveSP curveDir:FL_BR];

CGContextAddLineToPoint(context, w, bMargin);

//CGContextDrawPath(context, nonInvertedView);

CGContextDrawPath(context, kCGPathStroke);
// fill with pattern
drawPattern(context);

实际的苹果示例还在绘图方法中包含一个 NSRect arg,但由于我不想填充矩形,所以我想我可以省略它。但不确定。

谢谢

最佳答案

CGContextDrawPath 重置当前路径。 (他们曾经在某处提到过这一点,但我在快速搜索中找不到它。)

在描边之前保存图形状态,然后在填充图案之前恢复。

(我假设您专门尝试通过描边然后填充一半以上来获得外部笔划。如果您想要或可以接受居中笔划,kCGPathFillStroke 将使用单个CGContextDrawPath调用。)

关于cocoa - 如何在 Quartz 中用图案填充路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16243225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com