CGGradient — is een Core Graphics-object dat een vloeiende overgang tussen twee of meer kleuren vertegenwoordigt. In tegenstelling tot het tekenen van een verloopkleur via een lus met kleurverandering, gebruikt CGGradient hardwareversneld rekenwerk en ondersteunt twee typen: lineair (axial) en radiaal (radial). Volgens Apple Documentation (2026) wordt CGGradient gebruikt voor het maken van realistische vullingen, achtergrondeffecten en het simuleren van lichtbronnen in iOS- en macOS-interfaces.
Belangrijkste punten
CGGradient — is een onveranderlijk object in Core Graphics dat een reeks kleuren en de regels voor het mengen ervan langs de verloopovergang inkapselt. Intern slaat CGGradient een reeks CGColor op, een reeks posities (locations) in het bereik [0.0, 1.0] en een verwijzing naar CGColorSpace waarin de kleuren worden geïnterpreteerd. Elke kleur is gekoppeld aan een positie op de verloopschaal: positie 0.0 komt overeen met het begin, 1.0 met het einde van de overgang.
Bij het maken van CGGradient via de functie CGGradientCreateWithColors voert Core Graphics een voorberekening uit van tussentijdse kleurwaarden. Het verloop kan een willekeurig aantal kleurstops bevatten, waardoor complexe meerkleurige overgangen mogelijk zijn. Het aantal kleuren moet minimaal twee zijn en elke kleur moet een overeenkomstige positie hebben in de locations-reeks.
De architectuur van CGGradient verschilt van hogere API's zoals CAGradientLayer van Core Animation doordat het direct werkt in de grafische context van Core Graphics. Dit geeft volledige controle over het tekenproces en de mogelijkheid om verloopkleuren te combineren met andere Quartz 2D-bewerkingen — knipmaskers, schaduwen en transformaties.
Core Graphics ondersteunt twee typen verloopkleuren: lineair (axial) en radiaal (radial). Lineair verloop wordt gemaakt door de functie CGGradientCreateWithColors en getekend via CGContextDrawLinearGradient. Radiaal verloop vereist dezelfde CGGradient-structuur, maar wordt getekend via CGContextDrawRadialGradient.
| Type | Tekenfunctie | Parameters | Toepassing |
|---|---|---|---|
| Lineair | CGContextDrawLinearGradient | startPoint, endPoint, options | Achtergronden, knoppen, voortgangsbalken |
| Radiaal | CGContextDrawRadialGradient | startCenter, startRadius, endCenter, endRadius, options | Gloei-effecten, lichtbronnen, schaduwen |
Lineair verloop strekt de kleurovergang uit langs een rechte lijn van het beginpunt startPoint naar het eindpunt endPoint. Kleuren worden geïnterpoleerd tussen deze twee punten, en buiten hun grenzen wordt het gedrag bepaald door de uitbreidingsopties. Lineair verloop is ideaal voor het maken van vloeiende achtergronden, het simuleren van metalen oppervlakken en kleurovergangen in interface-elementen.
Radiaal verloop creëert een kleurovergang van de ene cirkel naar de andere. Elke cirkel wordt gedefinieerd door een middelpunt (startCenter / endCenter) en een straal (startRadius / endRadius). Kleur wordt geïnterpoleerd van de binnenste cirkel naar de buitenste. Een speciaal geval — wanneer de beginstraal 0 is: het verloop verspreidt zich vanuit één punt. Radiale verloopkleuren worden gebruikt voor het simuleren van lichtbronnen, lenzen, hemellichamen en spotlight-effecten.
CGGradient wordt slechts door één basisfunctie gemaakt — CGGradientCreateWithColors. De functie ontvangt CGColorSpace, een reeks CGColor (CFArray) en een reeks CGFloat locations. Als locations NULL is, worden kleuren gelijkmatig verdeeld over de verloopschaal. Als locations is opgegeven, moet de lengte overeenkomen met het aantal kleuren.
De locations-reeks bevat waarden van 0.0 tot 1.0 die de stoppunten van elke kleur bepalen. Waarden moeten monotoon stijgen. Als de eerste waarde groter is dan 0.0, wordt de kleur van het begin tot deze positie geëxtrapoleerd uit de kleur op positie 0.0. Analoog voor de laatste waarde kleiner dan 1.0. Dit gedrag wordt bepaald door de uitbreidingsopties bij het tekenen.
Bij het kiezen van kleuren voor het verloop is het belangrijk om rekening te houden met de kleurruimte. Alle kleuren in één CGGradient moeten tot dezelfde CGColorSpace behoren — Core Graphics interpoleert componenten in deze ruimte. Als kleuren in verschillende ruimtes zijn gemaakt, moeten ze vooraf worden omgezet naar een gemeenschappelijke ruimte via CGColorCreateCopyByMatchingToColorSpace.
Core Graphics biedt twee functies voor het tekenen van het verloop: CGContextDrawLinearGradient voor lineair en CGContextDrawRadialGradient voor radiaal. Beide functies ontvangen de grafische context, het CGGradient-object, uitbreidingsopties en typespecifieke geometrische parameters. Het tekenen gebeurt rekening houdend met de huidige knipmasker (clip) en contexttransformatie.
Uitbreidingsopties bepalen het gedrag van het verloop buiten het bereik van posities 0.0–1.0. De constante kCGGradientDrawsBeforeStartLocation vult het gebied vóór de startpositie met de kleur van de eerste stop. kCGGradientDrawsAfterEndLocation — met de kleur van de laatste stop. Deze opties kunnen worden gecombineerd via een bitmasker. Voor radiaal verloop worden de opties toegepast op het gebied buiten de begin- en eindstraal.
Het verloop wordt getekend in het coördinatensysteem van de huidige grafische context, rekening houdend met de transformatie (CTM — Current Transformation Matrix). Toepassing van CGContextTranslateCTM, CGContextScaleCTM of CGContextRotateCTM vóór het aanroepen van de tekenfunctie verandert de positie en schaal van het verloop. Dit maakt het mogelijk om één CGGradient te hergebruiken voor verschillende gebieden zonder nieuwe objecten te maken.
Core Graphics biedt verschillende extra mechanismen voor het beheren van verloopkleuren: anti-aliasing, maskering via een knipmasker (clipping mask) en combinatie met transparantie-effecten. Anti-aliasing is standaard ingeschakeld in de grafische context en wordt beheerd via CGContextSetShouldAntialias.
Knipmasker maakt het mogelijk om het tekengebied van het verloop te beperken tot een willekeurige vorm. Vóór het aanroepen van CGContextDrawLinearGradient moet een contour worden gedefinieerd via CGContextBeginPath, CGContextAddPath en CGContextClip. Het verloop wordt alleen getekend binnen het door deze contour begrensde gebied. Dit wordt veel gebruikt voor het maken van verloopiconen, knoppen en voortgangsbalken.
Uitbreiding van het verloop (extend) — nog een belangrijke parameter. Bij gebruik van kCGGradientDrawsBeforeStartLocation extrapoleert Core Graphics de kleur van de eerste stop naar het hele gebied tot startPoint. Zonder deze optie blijft het gebied buiten het verloop leeg (transparant). Combinatie van beide opties garandeert dat de hele rechthoek van de grafische context wordt gevuld met het verloop, zelfs als startPoint en endPoint zich erbinnen bevinden.
Laten we praktische voorbeelden bekijken van het maken en tekenen van verloopkleuren in iOS met CGGradient en Core Graphics.
Het voorbeeld maakt een lineair verloop met drie kleuren (blauw, groen, rood) en tekent het diagonaal over een UIView. De locations-reeks verdeelt de kleuren ongelijkmatig: blauw van 0.0 tot 0.3, groen op 0.6, rood van 0.6 tot 1.0.
func drawLinearGradient(in ctx: CGContext,
rect: CGRect) {
let colors = [
UIColor.blue.cgColor,
UIColor.green.cgColor,
UIColor.red.cgColor
] as CFArray
let locations: [CGFloat] = [0.0, 0.6, 1.0]
let space = CGColorSpaceCreateDeviceRGB()
guard let gradient = CGGradientCreateWithColors(
space, colors, locations
) else { return }
let start = CGPoint(x: 0, y: 0)
let end = CGPoint(x: rect.width,
y: rect.height)
ctx.drawLinearGradient(gradient,
start: start, end: end,
options: [.drawsBeforeStartLocation,
.drawsAfterEndLocation])
}
Het voorbeeld tekent een radiaal verloop dat een gloei-effect simuleert. Het beginpunt met straal nul definieert het centrum van de gloed en de buitenste cirkel de vervagingsgrens. Zo'n effect wordt gebruikt voor het verlichten van interface-elementen of activiteitsindicatoren.
func drawRadialGlow(in ctx: CGContext,
center: CGPoint) {
let colors = [
UIColor.white.cgColor,
UIColor.orange.cgColor,
UIColor.clear.cgColor
] as CFArray
let locations: [CGFloat] = [0.0, 0.4, 1.0]
let gradient = CGGradientCreateWithColors(
CGColorSpaceCreateDeviceRGB(), colors, locations)
ctx.drawRadialGradient(gradient,
startCenter: center, startRadius: 0,
endCenter: center, endRadius: 100,
options: [.drawsBeforeStartLocation,
.drawsAfterEndLocation])
}
In dit voorbeeld wordt het verloop beperkt tot een cirkelvormig gebied via een knipcontour. Vóór het tekenen van het verloop wordt een cirkelvormig pad gedefinieerd dat het huidige masker van de context wordt. Het verloop vult alleen het gebied binnen de cirkel, waardoor een verloopicooneffect ontstaat.
func drawGradientInCircle(in ctx: CGContext,
rect: CGRect) {
// Cirkelvormig knipad maken
let circlePath = CGMutablePath()
circlePath.addEllipse(in: rect)
ctx.addPath(circlePath)
ctx.clip()
// Verloop tekenen binnen knipmasker
let colors = [UIColor.magenta.cgColor,
UIColor.cyan.cgColor]
let gradient = CGGradientCreateWithColors(
CGColorSpaceCreateDeviceRGB(),
colors as CFArray, nil)
ctx.drawLinearGradient(gradient,
start: CGPoint(x: 0, y: 0),
end: CGPoint(x: rect.width,
y: rect.height),
options: [.drawsBeforeStartLocation])
}
Veelgestelde vragen
CGGradient — is een laag-niveau Core Graphics-object voor het tekenen in een grafische context. CAGradientLayer — is een hoog-niveau Core Animation-laag met automatische animatie en hardwareversnelling. CAGradientLayer is eenvoudiger te gebruiken voor UIKit, maar CGGradient biedt volledige controle en compatibiliteit met elke CGContext.
Minimaal aantal — 2 kleuren. De bovengrens wordt alleen beperkt door het beschikbare geheugen, omdat Core Graphics een reeks kleuren en een voorberekende interpolatietabel opslaat. In de praktijk zijn meer dan 10–15 kleuren in één verloop niet zinvol — de visuele overgang wordt niet te onderscheiden van vloeiend.
Gebruik CGColor met een alfakanaal kleiner dan 1.0 in de kleurenreeks. Bijvoorbeeld een kleur met transparantie wordt gemaakt als UIColor(red: 0, green: 0, blue: 1, alpha: 0.5).cgColor. Core Graphics interpoleert het alfakanaal op dezelfde manier als kleurcomponenten, waardoor een vloeiende transparantieovergang ontstaat.
Ja, CGGradient is onderdeel van Core Graphics, beschikbaar op beide platforms: iOS en macOS. Op macOS wordt het verloop getekend in elke NSView door het overschrijven van drawRect. Alle functies CGGradientCreateWithColors, CGContextDrawLinearGradient en CGContextDrawRadialGradient zijn identiek op beide platforms.
Om het verloop te roteren, pas een transformatie toe op de grafische context vóór het tekenen: CGContextRotateCTM(ctx, angle). De start- en eindpunten van het verloop worden gedefinieerd in het lokale coördinatensysteem van de context na transformatie. Als alternatief kunnen de geroteerde puntcoördinaten direct worden berekend zonder CTM te wijzigen.
Samenvatting
CGContextDrawLinearGradientCGContextDrawRadialGradientWe ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook