Iphone 在核心图形中将笔划应用于圆角矩形
我有一个具有圆角的渐变,我可以将其用于自定义UITableViewCell背景。我试图在路径上画一个笔划,但做不到,也看不出哪里出了问题Iphone 在核心图形中将笔划应用于圆角矩形,iphone,uitableview,core-graphics,drawrect,stroke,Iphone,Uitableview,Core Graphics,Drawrect,Stroke,我有一个具有圆角的渐变,我可以将其用于自定义UITableViewCell背景。我试图在路径上画一个笔划,但做不到,也看不出哪里出了问题 CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ; CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ; minx = minx + 1
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
minx = minx + 1;
miny = miny ;
maxx = maxx - 1;
maxy = maxy - 1;
CGContextMoveToPoint(c, minx, miny);
CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin);
CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin);
CGContextAddLineToPoint(c, maxx, miny);
CGContextAddLineToPoint(c, minx, miny);
// Fill and stroke the path
CGContextClip(c);
CGContextStrokePath(c);
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND;
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2);
CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0);
CGGradientRelease(myGradient);
CGColorSpaceRelease(myColorspace);
此代码将矩形向右舍入并应用渐变,但不划行。我的错在哪里
编辑: 根据subw的建议,我将代码更改为:
CGContextRef c = UIGraphicsGetCurrentContext();
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = nil;
CGFloat components[8] = TABLE_CELL_BACKGROUND;
CGContextSetFillColorWithColor(c, [[UIColor redColor] CGColor]);
CGContextSetStrokeColorWithColor(c, [[UAColor redColor] CGColor]);
CGContextSetLineWidth(c, 2);
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
minx = minx + 1;
miny = miny ;
maxx = maxx - 1;
maxy = maxy - 1;
CGContextMoveToPoint(c, minx, miny);
CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin);
CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin);
CGContextAddLineToPoint(c, maxx, miny);
CGContextAddLineToPoint(c, minx, miny);
// Fill and stroke the path
CGContextSaveGState(c);
CGContextClip(c);
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND;
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2);
CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0);
CGContextRestoreGState(c);
CGContextStrokePath(c);
但是直肠是这样出来的
…没有边界。如果我将CGContextStrokePath(c)
更改为CGContextStrokeRect(c,rect)
,则会显示笔划(为了澄清,我将其设置为红色)。但不知何故,当我抚摸这条路时,我没有得到任何抚摸:(
不确定,但可能是在笔划上绘制渐变?不确定,但可能是在笔划上绘制渐变?或者是在笔划上绘制渐变,或者是剪裁笔划区域 我认为以下方法可能更有效:
CGContextSaveGState(c);
CGContextClip(c);
//gradient drawing stuff
CGContextRestoreGState(c);
CGContextStrokePath(c);
当然,您还必须正确设置笔划颜色和宽度。您要么在笔划上绘制渐变,要么剪裁笔划区域 我认为以下方法可能更有效:
CGContextSaveGState(c);
CGContextClip(c);
//gradient drawing stuff
CGContextRestoreGState(c);
CGContextStrokePath(c);
当然,您还必须正确设置笔划颜色和宽度。为了响应您修订的代码,我引用文档: 与当前路径不同,当前剪裁路径是图形状态的一部分。因此,要通过将剪裁路径恢复到先前状态来重新放大可绘制区域,必须在剪裁之前保存图形状态,并在完成任何剪裁图形后恢复图形状态 确定新剪辑路径后,函数将上下文的当前路径重置为空路径 - 因此,当前绘图路径不是图形状态的一部分。下面是您正在执行的操作:
CGContextStrokePath(c)
更改为CGContextStrokeRect(c,rect)
,则会显示笔划
因为该函数在笔划之前将该矩形的路径添加到当前绘图路径中。响应修改后的代码,我引用文档: 与当前路径不同,当前剪裁路径是图形状态的一部分。因此,要通过将剪裁路径恢复到先前状态来重新放大可绘制区域,必须在剪裁之前保存图形状态,并在完成任何剪裁图形后恢复图形状态 确定新剪辑路径后,函数将上下文的当前路径重置为空路径 - 因此,当前绘图路径不是图形状态的一部分。下面是您正在执行的操作:
CGContextStrokePath(c)
更改为CGContextStrokeRect(c,rect)
,则会显示笔划
因为该函数在绘制笔划之前将该矩形的路径添加到当前绘制路径中。我不这样认为。我在更新代码中的渐变之后绘制笔划。我不这样认为。我在更新代码中的渐变之后绘制笔划。还有一个问题:您是否调用了CGContextBeginPath(c)某个地方?如果没有,那可能是个问题。我没有。我已经更新了代码,以显示在绘制单元格的代码的这一部分之前的内容。如果删除所有剪裁、渐变绘制以及保存和恢复图形状态的内容,是否绘制了路径?如果是,Peter Hoseys的答案可能是正确的。还有一个问题:您有ca吗ll到CGContextBeginPath(c)某个地方?如果没有,那可能是个问题。我没有。我已经更新了代码,以显示在绘制单元格的代码的这一部分之前的内容。如果删除所有的剪裁、渐变绘制以及保存和恢复图形状态的内容,是否绘制了路径?如果是,Peter Hoseys的答案可能是正确的。为什么当前路径被清除n设置剪辑路径?CGContextClip的文档没有提到这一点。subw:是的,他们提到了。“确定新剪辑路径后,函数会将上下文的当前路径重置为空路径。”之所以这样做,是因为PostScript(PDF的直接祖先)就是这样做的。这很有意义。我将尝试一下