我创建了一个视图,在我的绘制rect方法中,我根据用户对滑块的作用创建路径。使用标准颜色,一切正常,看起来非常好。我正在尝试关注苹果的代码片段,该代码片段展示了如何在此链接中将模式绘制到矩形中: Apple Drawing Guide
该示例演示如何使用所需模式创建函数回调,然后使用其他方法调用来绘制rect。如果我调用代码,因为它是从我的rect编写的,它将按照我的预期绘制我的模式,但是,我不想填充我的矩形,我想填充矩形中的指定路径。如果我将绘图方法中的调用从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,但由于我不想填充矩形,我想我可以省略它。但不确定。
由于
答案 0 :(得分:1)
CGContextDrawPath
重置当前路径。 (他们曾经在某个地方提到过,但我在快速搜索中找不到它。)
在描边之前保存图形状态,然后在填充图案之前恢复。
(我假设你特意试图通过抚摸然后填充超过一半来获得外部中风。如果你想要或可以接受中心卒中,kCGPathFillStroke
将用一个{CGContextDrawPath
完成工作。 1}}打电话。)
答案 1 :(得分:0)
所以继续更新:我不完全了解发生了什么,但是如果我将drawPattern方法中的代码放入带有空矩形的测试应用程序中,它就会像它应该的那样绘制。如果我将代码放入我的方法中以绘制路径到视图中,我会得到非常奇怪的行为;它甚至试图重新绘制它甚至不知道的视图控制器的部分。
一旦我删除了CGContextSaveGState(),CGColorSpaceRelease(),CGPatternRelease()和CGContextRestoreGState(),代码就开始完全按照我的意愿行事。我将方法修改为:
static void drawPattern(CGContextRef *pContext){
static CGPatternRef pattern;
static CGColorSpaceRef patternSpace;
static CGFloat alpha = 1.0;
static const CGPatternCallbacks callbacks = {0, &patternSpec, NULL};
patternSpace = CGColorSpaceCreatePattern (NULL);
CGContextSetFillColorSpace (pContext, patternSpace);
pattern = CGPatternCreate (NULL,
CGRectMake (0, 0, PATTERN_SIZE, PATTERN_SIZE),
CGAffineTransformIdentity,
PATTERN_SIZE,
PATTERN_SIZE,
kCGPatternTilingConstantSpacing,
true, &callbacks);
CGContextSetFillPattern (pContext, pattern, &alpha);
}
现在我可以调用已定义的模式,也可以设置定义填充颜色:
CGContextSetFillColor(context);
or:
drawPattern(context);
我希望对此有所了解,因为我想知道是否遗漏了一些saveState或Release方法是一个问题,如内存泄漏。
谢谢