Suavizando um golpe arredondado em gráficos principais
-
24-09-2019 - |
Pergunta
Estou criando meus próprios uitableViewCells com um background gradiente. Eu tenho toda a lógica e desenho funcionou, mas uma coisa que quero consertar é a "pedaço" nos cantos da minha célula personalizada:
Se você aumentar o zoom nos cantos, poderá ver do que estou falando. Aqui está o código que eu está usando para gerar a célula:
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);
O que posso fazer para suavizar as bordas, mantendo uma espessura consistente de borda em todas as células?
Solução
A largura da sua linha é definida como 2 pontos. O que está acontecendo é que seu código está calculando seu recorde limitado sem entender a largura da linha. O resultado é que, para cada segmento direto da sua forma, apenas metade da largura do golpe é visível. No arco, a largura total do curso é visível.
Aqui está o segmento relevante de código do meu aplicativo, Funversation, para desenhar as cartas de jogo com cantos arredondados semelhantes ao que você tem.
CGRect rect = [self bounds];
rect.size.width -= lineWidth;
rect.size.height -= lineWidth;
rect.origin.x += lineWidth / 2.0;
rect.origin.y += lineWidth / 2.0;
Adicione isso antes do seu cálculo para Minx, Midx, Maxx, etc., e os golpes para sua forma devem ser uniformes.
Outras dicas
A outra maneira de tornar o AVC consistente seria mover as chamadas AddPath e StrokePath acima da chamada Restauregstate - isto é, Stroke enquanto presa.
Para um golpe verdadeiramente de 2 ct com esta solução, basta dobrar a largura da linha que você coloca no estado gráfico (ou seja, defina-o como 4 pt), pois metade será cortado.