Es posible trazar rutas arbitrarias con un degradado, o cualquier otro efecto de relleno, como un patrón.
Como ha encontrado, las rutas contorneadas no se representan con el degradado actual. Solo las rutas llenas usan el degradado (cuando las conviertes en un clip y luego dibujas el degradado).
Sin embargo, núcleo de gráficos tiene un procedimiento increíblemente fresco CGContextReplacePathWithStrokedPath
que transformará el camino que va a accidente cerebrovascular en a un camino que es equivalente cuando se llena.
Detrás de escena, CGContextReplacePathWithStrokedPath
construye un polígono de borde alrededor de la trayectoria de su trazo y lo cambia para la ruta que ha definido. Especulo que el motor de renderizado Core Graphics probablemente lo haga de todos modos en llamadas al CGContextStrokePath
.
Aquí está la documentación de Apple en esto:
cuarzo crea un camino acariciado utilizando los parámetros del contexto gráfico actual. La nueva ruta se crea de modo que al llenarla se dibujen los mismos píxeles que cuando se acaricia la ruta original. Puede usar esta ruta de la misma manera que usa la ruta de cualquier contexto. Por ejemplo, puede hacer un clip a la versión acariciada de una ruta llamando a esta función seguida de una llamada a la función CGContextClip.
Por lo tanto, convertir su camino a algo que se puede llenar, a su vez que en un clip, y luego llamar su gradiente. El efecto será como si hubieras acariciado el camino con el degradado.
Código
Se verá algo como esto ...
// Get the current graphics context.
//
const CGContextRef context = UIGraphicsGetCurrentContext();
// Define your stroked path.
//
// You can set up **anything** you like here.
//
CGContextAddRect(context, yourRectToStrokeWithAGradient);
// Set up any stroking parameters like line.
//
// I'm setting width. You could also set up a dashed stroke
// pattern, or whatever you like.
//
CGContextSetLineWidth(context, 1);
// Use the magical call.
//
// It turns your _stroked_ path in to a **fillable** one.
//
CGContextReplacePathWithStrokedPath(context);
// Use the current _fillable_ path in to define a clipping region.
//
CGContextClip(context);
// Draw the gradient.
//
// The gradient will be clipped to your original path.
// You could use other fill effects like patterns here.
//
CGContextDrawLinearGradient(
context,
yourGradient,
gradientTop,
gradientBottom,
0
);
notas adicionales
Vale la pena enfatizar parte de la documentación anterior:
cuarzo crea un camino acariciado usando los parámetros del contexto gráfico actual.
El parámetro obvio es el ancho de línea. Sin embargo, se utiliza el estado de dibujo de línea, como patrón de trazo, límite de inglete, uniones de línea, límites, patrones de guiones, etc. Esto hace que el enfoque sea extremadamente poderoso.
Para obtener más información, consulte this answer de this S.O. question.
Una nota rápida: la respuesta seleccionada aquí es incorrecta. ** Es posible trazar caminos arbitrarios con un degradado ** como se muestra [esta respuesta] (http://stackoverflow.com/a/25034854/2547229). – Benjohn