Iphone 在核心图形中平滑圆角笔划

Iphone 在核心图形中平滑圆角笔划,iphone,core-graphics,rounded-corners,smoothing,stroke,Iphone,Core Graphics,Rounded Corners,Smoothing,Stroke,我正在用渐变背景创建自己的UITableViewCell。我已经解决了所有的逻辑和绘图问题,但我想解决的一件事是我的自定义单元格角落周围的“块状”: 如果你放大角落,你可以看到我在说什么。下面是我用来生成单元格的代码: CGContextRef c = UIGraphicsGetCurrentContext(); CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); CGGradientRef myGradient = ni

我正在用渐变背景创建自己的UITableViewCell。我已经解决了所有的逻辑和绘图问题,但我想解决的一件事是我的自定义单元格角落周围的“块状”:

如果你放大角落,你可以看到我在说什么。下面是我用来生成单元格的代码:

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点。发生的情况是,您的代码在计算边界矩形时没有理解行的宽度。结果是,对于形状的每个直线段,只有一半的笔划宽度可见。在圆弧上,整个笔划宽度可见

下面是我的应用程序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等之前添加该值,形状的笔划应该是一致的。

使笔划一致的另一种方法是将AddPath和StrokePath调用向上移动到RestoreState调用之上,即在剪裁时笔划


对于使用此解决方案的真正2磅宽的笔划,只需将图形状态下的线宽增加一倍(即,将其设置为4磅),因为其中一半将被剪裁掉。

这是一个多么好的答案。立即改进我的线路。谢谢