在Core Graphics中平滑圆角笔画

4
我正在创建带有渐变背景的UITableViewCells。我已经处理好所有逻辑和绘图,但我想要解决的一个问题是自定义单元格周围的“粗糙感”:
请点击以下链接查看截图:alt text http://grab.by/27SM 如果您放大角落,就会明白我在说什么。这是我用来生成单元格的代码:
CGContextRef c = UIGraphicsGetCurrentContext();
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = nil;
CGFloat components[8] = TABLE_CELL_BACKGROUND;
CGContextSetStrokeColorWithColor(c, [[UAColor colorWithWhite:0.7 alpha:1] CGColor]);
CGContextSetLineWidth(c, 2);
CGContextSetAllowsAntialiasing(c, YES);
CGContextSetShouldAntialias(c, YES);
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, minx, miny);
CGPathAddArcToPoint(path, NULL, minx, maxy, midx, maxy, kDefaultMargin);
CGPathAddArcToPoint(path, NULL, maxx, maxy, maxx, miny, kDefaultMargin);
CGPathAddLineToPoint(path, NULL, maxx, miny);
CGPathAddLineToPoint(path, NULL, minx, miny);
CGPathCloseSubpath(path);

// Fill and stroke the path
CGContextSaveGState(c);
CGContextAddPath(c, path);
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);  
CGContextAddPath(c, path);
CGContextStrokePath(c);

我该怎么做才能在保持所有单元格边缘厚度一致的同时使边缘更加平滑?
2个回答

7

您的线宽设置为2点。问题在于您的代码在计算边界矩形时未考虑线的宽度。结果是,对于形状的每个直线段,只有一半的描边宽度可见。在弧形上,完整的描边宽度是可见的。

以下是我应用程序Funversation中与您所拥有的带圆角的扑克牌类似的绘制方法的相关代码片段。

CGRect rect = [self bounds];
rect.size.width -= lineWidth;
rect.size.height -= lineWidth;
rect.origin.x += lineWidth / 2.0;
rect.origin.y += lineWidth / 2.0;

在计算 minx、midx、maxx 等之前,请添加此内容,这样您的形状笔画应该是均匀的。

太棒了,你的回答立刻让我的代码变得更好了。谢谢! - typeoneerror

1
让笔画保持一致的另一种方法是将AddPath和StrokePath调用上移至RestoreGState调用之上,即在剪辑时进行描边。
对于这个解决方案中真正的2磅宽度描边,只需将您放入图形状态中的线宽加倍(即将其设置为4磅),因为其中的一半将被剪裁掉。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接