在核心图形中平滑圆形中风
-
24-09-2019 - |
题
我正在创建具有渐变背景的UitableViewCells。我有所有的逻辑和绘画,但是我想修复的一件事是我自定义单元的角落周围的“矮胖”:
如果您放大角落,您可以看到我在说什么。这是I A用于生成单元格的代码:
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,并在RestoreGstate呼叫上方呼叫,也就是说,剪裁时中风。
对于使用此解决方案的真正2分宽的中风,只需将放置在图形状态的线宽度(即,将其设置为4 pt)加倍,因为其中一半将被删除。
不隶属于 StackOverflow