2014-03-06 22 views
5

Wie kann ich einen CAGradiantLayer verwenden, um möglichst effizient einen Gradienten um einen Kreis/mit Winkeln zu zeichnen?Verwenden von CAGradientLayer für einen Winkel-/Kreisgradienten

Ich habe die eine Unterseite mit Hilfe dieser project gemacht. Es verwendet einen Bitmap-Kontext zum Zeichnen, aber ein CAGradientLayer wäre weitaus effizienter.

Leider konnte ich nur herausfinden, wie man lineare Gradienten damit machen kann.

Antwort

3

Gradientlagen derzeit nur lineare Gradienten unterstützen. Wenn Sie jedoch die Schnittstelle für Farbverlaufsschichten betrachten, enthält sie eine type -Eigenschaft. Derzeit ist der einzige definierte Typ kCAGradientLayerAxial (linear).

Die Tatsache, dass es eine Typeigenschaft gibt, legt nahe, dass Apple zu einem späteren Zeitpunkt weitere Typen hinzufügen wird, und radiale Gradienten scheinen eine sehr ähnliche Addition zu sein.

Sie könnten Ihre eigene benutzerdefinierte Unterklasse von CAGradientLayer erstellen, die sowohl radiale als auch lineare Gradienten zeichnet. Ich habe Demo-Projekte im Internet gesehen, die benutzerdefinierte CALayer-Unterklassen erstellen.

+0

Hey danke für die Antwort, yeah das Projekt, das ich oben verlinkt, erstellt eine Unterklasse von CALayer, um den Winkelgradienten, den ich oben gezeigt habe, zu rendern. Leider ist das ziemlich langsam, da es zu einem CGBitmapContext zeichnet. – Max

+1

Leider war kCAGradientLayerAxial seit seiner Einführung der einzige unterstützte Gradiententyp. Obwohl wir davon ausgehen können, dass die Unterstützung für andere Arten von Gradienten irgendwann hinzugefügt wird, werde ich es nicht in absehbarer Zeit tun. –

+1

Core Graphics verfügt über die CGContextDrawRadialGradient-Methode. Zeit, um eine benutzerdefinierte Unterklasse von CAGradientLayer zu implementieren, die Ihren eigenen Verlaufstyp unterstützt. Sie können drawInContext implementieren und CGContextDrawRadialGradient aufrufen. Es sollten nur ein paar Zeilen Code und einige zusätzliche Eigenschaften auf der Ebene implementiert werden. –