2010-04-29 15 views
15

Usando la plétora de funciones de dibujo en Cocoa o Quartz es bastante fácil trazar caminos y llenarlos con un degradado. Sin embargo, parece que no puedo encontrar una forma aceptable de 'trazar': dibujar un trazado con un ancho de línea de unos pocos píxeles y llenar este trazo con un degradado. ¿Cómo se hace esto?En OSX, ¿cómo llento un degradado un trazo de ruta?

Editar: Aparentemente la pregunta no era lo suficientemente clara. Gracias por las respuestas hasta ahora, pero ya lo descubrí. Lo que quiero hacer es lo siguiente:

squares http://emle.nl/forumpics/misc/squares.png

El cuadro de la izquierda se dibuja NSGradient en un camino seguido por un mensaje de carrera camino. El derecho es lo que quiero hacer; Quiero llenar el trazo con el degradado.

Respuesta

20

Si convierte el NSBezierPath a un CGPath, puede utilizar el método CGContextReplacePathWithStrokedPath() para recuperar un camino que es el esquema de la trayectoria acariciado. El excelente de Graham Cox GCDrawKit tiene un método de categoría -strokedPath en NSBezierPath que lo hará por usted sin necesidad de desplegarlo en Core Graphics.

Una vez que tenga la ruta descrita, puede completarla con NSGradient.

+0

¡Maravilloso!Gracias :) Gracias por el enlace a Drawkit también, se ve muy bien. – Emiel

+0

Tuve problemas para hacer esto, mi gradiente llenó toda el área recortada, en lugar de la ruta (quizás esto también tenía que ver con hacer clipping). Terminé dibujando una forma que era simplemente el contorno del borde, recortando en ese camino, y luego usando el relleno de degradado, y que funcionó mejor. – GoldenBoy

13

No puedo encontrar una forma aceptable, sin embargo, para 'trazar': trace un trazado con un ancho de línea de unos pocos píxeles y complete este trazo con un degradado. ¿Cómo se hace esto?

[Respuesta original sustituido por el siguiente]

Ah, ya veo. Desea aplicar el degradado al trazo.

Para hacer eso, usa un modo de mezcla. Me explicó cómo hacer esto en una respuesta en another question. Aquí está la lista de pasos, adaptada a su objetivo:

  1. empezar una transparency layer.
  2. Recorre la ruta con cualquier color no transparente.
  3. Set the blend mode a source in.
  4. Dibuja el degradado.
  5. Finaliza la capa de transparencia.
+0

Gracias por la respuesta. Sin embargo, no es lo que trato de lograr. He aclarado la pregunta un poco. – Emiel

+0

Emiel: Ah, ya veo. He reemplazado el contenido anterior de mi respuesta con una nueva respuesta. –

8

Según la respuesta de Peter Hosey He conseguido hacer una curva de pendiente simple, que se ve así:

Gradient Curve Image

que he hecho esto en drawRect (_ :) método de la clase UIView por escribiendo el siguiente código:

override func drawRect(rect: CGRect) { 
    let context = UIGraphicsGetCurrentContext() 

    CGContextBeginTransparencyLayer (context, nil) 
    let path = createCurvePath() 
    UIColor.blueColor().setStroke() 
    path.stroke() 
    CGContextSetBlendMode(context, .SourceIn) 

    let colors   = [UIColor.blueColor().CGColor, UIColor.redColor().CGColor] 
    let colorSpace  = CGColorSpaceCreateDeviceRGB() 
    let colorLocations :[CGFloat] = [0.0, 1.0] 
    let gradient  = CGGradientCreateWithColors(colorSpace, colors, colorLocations) 
    let startPoint  = CGPoint(x: 0.0, y: rect.size.height/2) 
    let endPoint  = CGPoint(x: rect.size.width, y: rect.size.height/2) 

    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, CGGradientDrawingOptions.DrawsBeforeStartLocation) 
    CGContextEndTransparencyLayer(context) 
} 

La función createCurvePath() devuelve un objeto UIBezierPath. También he establecido path.lineWidth en 5 puntos.

+0

¿Sabe si es posible hacer que la ruta sea azul al principio y roja al final, pero f.e. doblar la curva de vuelta a donde comenzó? – Georg

Cuestiones relacionadas