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:

ALT TEXTO http://grab.by/27sm

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top