2010-04-29 7 views
15

Korzystanie z mnóstwa funkcji rysowania w kakao lub kwarcu jest dość łatwe do narysowania ścieżek i wypełnienia ich za pomocą gradientu. Nie mogę jednak znaleźć możliwego do zaakceptowania sposobu na "obrys" - narysuj ścieżkę o szerokości linii kilku pikseli i wypełnij ten obrys za pomocą gradientu. Jak to się robi?W systemie OSX w jaki sposób gradient wypełnić wypełnienie ścieżki?

Edycja: Podobno pytanie nie było wystarczająco jasne. Dzięki za dotychczasowe odpowiedzi, ale już to rozgryzłem. Co chcę zrobić to:

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

Lewa kwadrat NSGradient sporządzony w ścieżce następnie komunikat udaru ścieżka. Właściwe jest to, co chcę robić; Chcę wypełnić obrys za pomocą gradientu.

Odpowiedz

20

Jeśli konwersja NSBezierPath do CGPath, można użyć metody CGContextReplacePathWithStrokedPath() aby pobrać ścieżkę, która jest zarys The Strokes ścieżce. Graham Cox ma doskonałą GCDrawKit ma metodę kategorii -strokedPath na NSBezierPath, która zrobi to za Ciebie bez konieczności rozwijania do Core Graphics.

Po utworzeniu zakreślonej ścieżki można wypełnić tę ścieżkę za pomocą NSGradient.

+0

Cudownie!Dziękuję :) Dzięki za link do drawkita też wygląda bardzo ładnie. – Emiel

+0

Miałem problemy z wykonaniem tej pracy - mój gradient wypełnił cały obcinany obszar, a nie ścieżkę (być może miało to również związek z wycinaniem). Skończyło się na rysowaniu jednego kształtu, który był po prostu obrysem granicy, przycinania do tej ścieżki, a następnie użyciu wypełnienia gradientowego i to działało najlepiej. – GoldenBoy

13

Nie mogę jednak znaleźć możliwego do zaakceptowania sposobu na "obrys" - narysuj ścieżkę o szerokości linii kilku pikseli i wypełnij ten obrys za pomocą gradientu. Jak to się robi?

[odpowiedź oryginalny otrzymuje brzmienie]

Ah, widzę. Chcesz zastosować gradient do obrysu.

Aby to zrobić, należy użyć trybu mieszania. I wyjaśnił, jak to zrobić w odpowiedzi na another question. Oto lista kroków, dostosowany do celu:

  1. Rozpocznij transparency layer.
  2. Skróć ścieżkę z dowolnym nieprzezroczystym kolorem.
  3. Set the blend mode do source in.
  4. Narysuj gradient.
  5. Zakończ warstwę przezroczystości.
+0

Dzięki za odpowiedź. To jednak nie jest to, co staram się osiągnąć. Trochę wyjaśniłem to pytanie. – Emiel

+0

Emiel: Ah, rozumiem. Zastąpiłem poprzednią treść mojej odpowiedzi nową odpowiedzią. –

8

Według odpowiedź Petera Hosey za udało mi się zrobić prostą krzywą gradientu, który wygląda tak:

Gradient Curve Image

Robiłem to w drawRect (_ :) metoda klasy UIView przez pisząc poniższy kod:

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

Funkcja createCurvePath() zwraca obiekt obiektu UIBezierPath. Ustawiłem również path.lineWidth na 5 punktów.

+0

Czy wiesz, że jest możliwe, aby ścieżka była niebieska na początku, a czerwona na końcu, ale f.e. wygiąć krzywą z powrotem do miejsca, w którym się zaczęło? – Georg