2016-12-07 36 views
11

Pytanie:Jak wypełnić warstwę CAShapeLayer nachylonym pod kątem?

Jak mam wypełnić CAShapeLayer() z gradientem i na kątem 45 stopni ?

Na przykład, w obrazu 1, poniżej kod rysuje kwadratu i wypełnia warstwę niebieskiego (UIColor.blueColor().CGColor).

Ale jak mam wypełnić go gradientem na kątem 45 stopni od niebieskiego do czerwonego jak w obrazu 2 (tj UIColor.blueColor().CGColor do UIColor.redColor().CGColor)?

Kod:

let path = UIBezierPath() 
path.moveToPoint(CGPoint(x: 0, y: 0)) 
path.addLineToPoint(CGPoint(x: 0, y: 100)) 
path.addLineToPoint(CGPoint(x: 100, y: 100)) 
path.addLineToPoint(CGPoint(x: 100, y: 0)) 
path.closePath() 

let shape = CAShapeLayer() 
shape.path = path.CGPath 
shape.fillColor = UIColor.blueColor().CGColor 

enter image description here

Odpowiedz

15

Dlaczego nie skorzystać CAGradientLayer który ma startPoint i endPoint właściwości.

można zrobić:

import UIKit 
import PlaygroundSupport 

let frame = CGRect(x: 0, y: 0, width: 100, height: 100) 
let view = UIView(frame: frame) 

PlaygroundPage.current.liveView = view 

let path = UIBezierPath(ovalIn: frame) 

let shape = CAShapeLayer() 
shape.frame = frame 
shape.path = path.cgPath 
shape.fillColor = UIColor.blue.cgColor 

let gradient = CAGradientLayer() 
gradient.frame = frame 
gradient.colors = [UIColor.blue.cgColor, 
        UIColor.red.cgColor] 
gradient.startPoint = CGPoint(x: 0, y: 1) 
gradient.endPoint = CGPoint(x: 1, y: 0) 
gradient.mask = shape 

view.layer.addSublayer(gradient) 

enter image description here

Uwaga: Dodano ścieżkę bezier na kole, bo to działa bez maski na placu.

+1

Podoba mi się zrzut ekranu placu zabaw pokazujący kod oraz wynikowy obraz. Miły dotyk (głosowanie.) Dlaczego jednak nie podać całego kodu na plac zabaw? W ten sposób czytelnicy mogą odtworzyć uruchomiony kod za pomocą prostego kopiowania i wklejania z nim. –

+0

Myślałem o tym, ale założyłem, że to jest dla aplikacji, i pod warunkiem, że część do wklejenia w aplikacji. – Alistra

+0

Pamiętaj, że wpisy SO są przydatne dla więcej niż tylko oryginalnego SO. Inni ludzie (tacy jak ja) przychodzą i chcą pracować/uczyć się z opublikowanego kodu. Pomyślałem: "Fajnie, działający plac zabaw z warstwą gradientową. Fajnie byłoby dodać animację obracania, która obraca gradient w kółko ...", ale twój kod był obrazem, a nie tekstem. Nie spadłem jak pisanie na klawiaturze, więc chęć majstrowania umarła. –

1

myślę, że to

shape.startPoint = CGPoint(x: 1.0, y: 0.0) 
shape.endPoint = CGPoint(x: 0.0, y: 1.0) 

, który jest pierwszy kolor w prawym dolnym rogu do drugiego koloru w lewym górnym rogu. Jeśli chcesz pierwszy kolor w prawym górnym rogu, a drugi kolor na dole po lewej stronie, to należy mieć

shape.startPoint = CGPoint(x: 1.0, y: 1.0) 
shape.endPoint = CGPoint(x: 0.0, y: 0.0) 

pierwszego koloru w górnym rogu drugiego koloru w prawym dolnym

shape.startPoint = NSMakePoint(x: 0.0, y: 1.0) 
shape.endPoint = NSMakePoint(x: 1.0, y: 0.0) 

pierwszy kolor w lewym dolnym rogu, drugi kolor u góry po prawej

shape.startPoint = CGPoint(x: 0.0, y: 0.0) 
shape.endPoint = CGPoint(x: 1.0, y: 1.0)