Pregunta

I tiene un gradiente que tiene esquinas redondeadas que un uso de una costumbre UITableViewCell fondo. Estoy tratando de aplicar un trazo a la ruta, pero no puedo hacerlo, y no puedo ver dónde voy mal.

  CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
  CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
  minx = minx + 1;
  miny = miny ;

  maxx = maxx - 1;
  maxy = maxy - 1;

  CGContextMoveToPoint(c, minx, miny);
  CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin);
  CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin);
  CGContextAddLineToPoint(c, maxx, miny);
  CGContextAddLineToPoint(c, minx, miny);

  // Fill and stroke the path
  CGContextClip(c);
  CGContextStrokePath(c);  

  CGFloat locations[2] = { 0.0, 1.0 };
  CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND;
  CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
  CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2);
  CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0);
  CGGradientRelease(myGradient);
  CGColorSpaceRelease(myColorspace);

Este código redondea la derecha rectángulo y se aplica el gradiente, pero no realiza un recorrido de la fila. ¿Dónde está mi error?

alt text http://grab.by/26Ye


EDIT: Según las recomendaciones del SUBW, he cambiado el código a ser:

    CGContextRef c = UIGraphicsGetCurrentContext();
    CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef myGradient = nil;
    CGFloat components[8] = TABLE_CELL_BACKGROUND;
    CGContextSetFillColorWithColor(c, [[UIColor redColor] CGColor]);
    CGContextSetStrokeColorWithColor(c, [[UAColor redColor] CGColor]);
    CGContextSetLineWidth(c, 2);

    CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
    CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
    minx = minx + 1;
    miny = miny ;

    maxx = maxx - 1;
    maxy = maxy - 1;

    CGContextMoveToPoint(c, minx, miny);
    CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin);
    CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin);
    CGContextAddLineToPoint(c, maxx, miny);
    CGContextAddLineToPoint(c, minx, miny);

    // Fill and stroke the path
    CGContextSaveGState(c);
    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);
    CGContextStrokePath(c);

Pero el rect sale así ...

texto alternativo http://grab.by/2714

... sin frontera. Si cambio la CGContextStrokePath(c) ser CGContextStrokeRect(c, rect), los espectáculos carrera ascendente (I hicieron rojo de aclaración). Pero de alguna manera, cuando se acaricia el camino, no estoy recibiendo ningún derrame cerebral: (

alt text http://grab.by/27aM

¿Fue útil?

Solución

En respuesta a su código revisado, cito la documentación:

  

A diferencia de la ruta actual, el trazado de recorte actual es parte del estado de los gráficos. Por lo tanto, para volver a agrandar el área que se puede pintar restaurando el trazado de recorte a un estado anterior, debe guardar el estado de los gráficos antes de clip y restaurar el estado de los gráficos después de haber completado cualquier dibujo recortado.

     

Después de determinar el nuevo trazado de recorte, la función vuelve ruta actual del contexto de un camino vacío.

- CGContextClip

Por lo tanto, la ruta de dibujo actual es no parte del estado de los gráficos. Así que esto es lo que está haciendo:

  1. trazo de dibujo Construir
  2. Guardar GSTATE
  3. Añadir ruta de dibujo actual al camino de corte; ruta clara dibujo actual
  4. Dibujar gradiente
  5. GSTATE Restore (trazado de recorte anterior se restaura; ruta dibujo permanece vacío)
  6. Trazo nada

La solución es llamar la trayectoria en un objeto CGPath, a continuación, agregarlo como la trayectoria de la corriente, tanto antes de la saturación (después de guardar el GSTATE) y antes de acariciar.

También debe decidir si desea que se trata de un accidente cerebrovascular exterior, un trazo interior, o un derrame cerebral centrada. Por un golpe centrado, derrame cerebral mientras no recortado. Para un derrame cerebral interna, derrame cerebral mientras recortado. Para una carrera exterior, invertir el camino, entonces clip, a continuación, accidente cerebrovascular. Usted querrá el doble de su ancho de línea para ambos las dos últimas formas, ya que va a recortando la mitad de la carrera.

  

Si cambio la CGContextStrokePath(c) ser CGContextStrokeRect(c, rect), los espectáculos carrera ascendente.

Debido a que la función añade un camino de ese rectángulo a la trayectoria de dibujo actual antes de acariciar.

Otros consejos

No es seguro, pero tal vez usted está pintando el gradiente durante la carrera?

O estás dibujando el gradiente a lo largo de la carrera, y / o la saturación de la región en la que un derrame cerebral.

Creo que el siguiente trabajo podría mejor:

CGContextSaveGState(c);
CGContextClip(c);

//gradient drawing stuff

CGContextRestoreGState(c);
CGContextStrokePath(c);

Por supuesto, también hay que ajustar el color del trazo y el ancho correctamente.

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