我有一个具有圆角的渐变,我用它来自定义UITableViewCell背景。我试图在路径上应用笔划,但不能完全做到,并且无法看到我出错的地方。
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)
,则会显示笔画(我将其设为红色以便澄清)。但不知何故,在抚摸路径时,我没有得到任何中风:(
答案 0 :(得分:5)
回应您修改后的代码,我引用文档:
与当前路径不同,当前剪切路径是图形状态的一部分。因此,要通过将剪切路径恢复到先前状态来重新放大可绘制区域,必须在剪辑之前保存图形状态,并在完成任何剪切绘图后恢复图形状态。
确定新的剪切路径后,该函数将上下文的当前路径重置为空路径。
因此,当前绘制路径不是图形状态的一部分。所以这就是你正在做的事情:
解决方案是将路径绘制到CGPath对象中,然后在剪切之前(保存gstate之后)和行程之前将其添加为当前路径。
您还应该决定是将其设置为外部笔划,内部笔划还是中心笔划。对于中心笔划,笔划未剪裁。对于内部笔划,剪裁时的笔划。对于外部笔划,反转路径,然后剪切,然后中风。你需要将最后两种形式的线宽加倍,因为你将裁掉一半的笔画。
如果我将
CGContextStrokePath(c)
更改为CGContextStrokeRect(c, rect)
,则会显示笔画。
因为该函数在行程之前将该矩形的路径添加到当前绘图路径。
答案 1 :(得分:0)
不确定,但也许你在描边上画渐变?
答案 2 :(得分:0)
您要在笔划上绘制渐变,和/或剪裁您描边的区域。
我认为以下内容可能会更好:
CGContextSaveGState(c);
CGContextClip(c);
//gradient drawing stuff
CGContextRestoreGState(c);
CGContextStrokePath(c);
当然,您还必须正确设置笔触颜色和宽度。