Pregunta

Estoy creando mis propias cáldicas UableView con antecedentes de gradiente. Tengo toda la lógica y el dibujo, pero una cosa que quiero arreglar es la "gruesa" alrededor de las esquinas de mi celda personalizada:

texto alt http://grab.by/27sm

Si se acerca a las esquinas, puede ver de qué estoy hablando. Aquí está el código que estoy usando para generar la celda:

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);

¿Qué puedo hacer para suavizar los bordes mientras mantiene un grosor de borde consistente en todas las celdas?

¿Fue útil?

Solución

Su ancho de línea se establece en 2 puntos. Lo que está sucediendo es que su código está calculando su recto delimitador sin comprender el ancho de la línea. El resultado es que para cada segmento recto de su forma, solo la mitad del ancho del trazo es visible. En el arco, el ancho de trazo completo es visible.

Aquí está el segmento relevante de código de mi aplicación, Funversation, para dibujar las cartas de juego con esquinas redondeadas similares a lo que tiene.

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

Agregue eso antes de su cálculo para Minx, MIDX, MAXX, etc. y los trazos para su forma deben ser uniformes.

Otros consejos

La otra forma de hacer que la carrera sea consistente sería mover el ADDPATH y el StrokePath llamadas por encima de la llamada de restauración, es decir, el trazo mientras se recorta.

Para una carrera verdaderamente de 2 pt-anchos con esta solución, simplemente duplique el ancho de línea que coloca en el estado de gráficos (es decir, configúrelo en 4 pt), ya que la mitad se recortará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top