CGGradient : ce que c'est, types de dégradés et leur création

Auteur : IT Sectr Publié le : 2026-07-21 Temps de lecture : 9 min

CGGradient est un objet Core Graphics qui représente une transition en douceur entre deux ou plusieurs couleurs. Contrairement au dessin d'un dégradé via une boucle avec changement de couleur, CGGradient utilise un calcul accéléré par le matériel et prend en charge deux types : linéaire (axial) et radial. Selon la Documentation Apple (2026), CGGradient est utilisé pour créer des remplissages réalistes, des effets d'arrière-plan et simuler des sources de lumière dans les interfaces iOS et macOS.

Points Clés

  • CGGradient est un objet Core Graphics pour créer des transitions de couleur douces entre des points
  • Dégradé linéaire (axial) — transition de couleur le long d'une ligne droite entre le point de départ et le point d'arrivée
  • Dégradé radial — transition de couleur d'un point central vers un cercle extérieur
  • Un dégradé est créé à partir d'un tableau de couleurs CGColor et d'un tableau de positions (locations) de 0,0 à 1,0
  • Core Graphics effectue le rendu du dégradé avec composition alpha et anti-crénelage (antialiasing)

Qu'est-ce que CGGradient ?

CGGradient est un objet immuable dans Core Graphics qui encapsule un ensemble de couleurs et des règles pour les mélanger le long d'une transition de dégradé. En interne, CGGradient stocke un tableau de CGColor, un tableau de positions (locations) dans la plage [0,0, 1,0] et une référence au CGColorSpace dans lequel les couleurs sont interprétées. Chaque couleur est associée à une position sur l'échelle du dégradé : la position 0,0 correspond au début, 1,0 à la fin de la transition.

Lors de la création d'un CGGradient via la fonction CGGradientCreateWithColors, Core Graphics précalcule les valeurs de couleur intermédiaires. Un dégradé peut contenir un nombre arbitraire d'arrêts de couleur (color stops), permettant des transitions complexes à plusieurs couleurs. Le nombre de couleurs doit être d'au moins deux, et chaque couleur doit correspondre à une position dans le tableau locations.

L'architecture de CGGradient diffère des API de plus haut niveau telles que CAGradientLayer de Core Animation en ce qu'elle fonctionne directement dans le contexte Core Graphics. Cela offre un contrôle total sur le processus de dessin et la capacité de combiner des dégradés avec d'autres opérations Quartz 2D — masques de détourage, ombres et transformations.

Dégradés linéaires et radiaux

Core Graphics prend en charge deux types de dégradés : linéaire (axial) et radial. Un dégradé linéaire est créé avec la fonction CGGradientCreateWithColors et dessiné avec CGContextDrawLinearGradient. Un dégradé radial nécessite la même structure CGGradient mais est dessiné avec CGContextDrawRadialGradient.

TypeFonction de dessinParamètresUtilisation
LinéaireCGContextDrawLinearGradientstartPoint, endPoint, optionsFonds, boutons, barres de progression
RadialCGContextDrawRadialGradientstartCenter, startRadius, endCenter, endRadius, optionsReflets, sources de lumière, ombres

Dégradé linéaire (Axial)

Dégradé linéaire étend la transition de couleur le long d'une ligne droite du point de départ startPoint au point d'arrivée endPoint. Les couleurs sont interpolées entre ces deux points, et le comportement au-delà est contrôlé par les options d'extension. Le dégradé linéaire est idéal pour créer des fonds lisses, simuler des surfaces métalliques et des transitions de couleur dans les éléments d'interface.

Dégradé radial

Dégradé radial crée une transition de couleur d'un cercle à un autre. Chaque cercle est défini par un centre (startCenter / endCenter) et un rayon (startRadius / endRadius). La couleur est interpolée du cercle intérieur vers le cercle extérieur. Un cas particulier est lorsque le rayon initial est 0 : le dégradé rayonne à partir d'un seul point. Les dégradés radiaux sont utilisés pour simuler des sources de lumière, des lentilles, des corps célestes et des effets de projecteur.

Créer CGGradient : couleurs et positions

CGGradient est créé avec une seule fonction de base — CGGradientCreateWithColors. La fonction prend un CGColorSpace, un tableau de CGColor (CFArray) et un tableau de CGFloat locations. Si locations est NULL, les couleurs sont réparties uniformément le long de l'échelle du dégradé. Si locations sont spécifiées, leur nombre doit correspondre au nombre de couleurs.

Le tableau locations contient des valeurs de 0,0 à 1,0 qui définissent les points d'arrêt pour chaque couleur. Les valeurs doivent augmenter de manière monotone. Si la première valeur est supérieure à 0,0, la couleur du début jusqu'à cette position est extrapolée à partir de la couleur à la position 0,0. De même pour la dernière valeur inférieure à 1,0. Ce comportement est contrôlé par les options d'extension lors du dessin.

Lors du choix des couleurs pour un dégradé, il est important de considérer l'espace colorimétrique. Toutes les couleurs dans un même CGGradient doivent appartenir au même CGColorSpace — Core Graphics interpole les composants dans cet espace. Si les couleurs sont créées dans des espaces différents, elles doivent d'abord être converties vers un espace commun via CGColorCreateCopyByMatchingToColorSpace.

Dessiner un dégradé dans le contexte

Core Graphics fournit deux fonctions pour dessiner un dégradé : CGContextDrawLinearGradient pour le linéaire et CGContextDrawRadialGradient pour le radial. Les deux fonctions acceptent un contexte graphique, un objet CGGradient, des options d'extension et des paramètres géométriques spécifiques au type. Le dessin est effectué en tenant compte du masque de détourage actuel et de la transformation du contexte.

Options d'extension (Gradient Options)

Les options d'extension contrôlent le comportement du dégradé au-delà de la plage de positions 0,0–1,0. La constante kCGGradientDrawsBeforeStartLocation remplit la zone avant la position de départ avec la couleur du premier arrêt. kCGGradientDrawsAfterEndLocation remplit avec la couleur du dernier arrêt. Ces options peuvent être combinées via un masque de bits. Pour les dégradés radiaux, les options s'appliquent à la zone au-delà des rayons de début et de fin.

Effet des transformations

Le dégradé est dessiné dans le système de coordonnées du contexte graphique actuel, en tenant compte de sa transformation (CTM — Current Transformation Matrix). L'application de CGContextTranslateCTM, CGContextScaleCTM ou CGContextRotateCTM avant d'appeler la fonction de dessin modifie la position et l'échelle du dégradé. Cela permet de réutiliser un seul CGGradient pour différentes zones sans créer de nouveaux objets.

Options : extension, lissage et masquage

Core Graphics fournit plusieurs mécanismes supplémentaires pour contrôler les dégradés : l'anti-crénelage (antialiasing), le masquage via un masque de détourage (clipping mask) et la combinaison avec des effets de transparence. L'anti-crénelage est activé par défaut dans le contexte graphique et est contrôlé via CGContextSetShouldAntialias.

Masque de détourage permet de restreindre la zone de dessin du dégradé à une forme arbitraire. Avant d'appeler CGContextDrawLinearGradient, il est nécessaire de définir un chemin via CGContextBeginPath, CGContextAddPath et CGContextClip. Le dégradé est dessiné uniquement à l'intérieur de la zone délimitée par ce chemin. Ceci est largement utilisé pour créer des icônes dégradées, des boutons et des barres de progression.

L'extension du dégradé est un autre paramètre important. Lors de l'utilisation de kCGGradientDrawsBeforeStartLocation, Core Graphics extrapole la couleur du premier arrêt sur toute la zone avant startPoint. Sans cette option, la zone en dehors du dégradé reste non remplie (transparente). La combinaison des deux options garantit que tout le rectangle du contexte graphique est rempli avec un dégradé, même si startPoint et endPoint se trouvent à l'intérieur.

Exemples de code Swift

Voyons des exemples pratiques de création et de dessin de dégradés dans iOS en utilisant CGGradient et Core Graphics.

Dégradé linéaire avec trois couleurs

Cet exemple crée un dégradé linéaire avec trois couleurs (bleu, vert, rouge) et le dessine en diagonale à travers une UIView. Le tableau locations distribue les couleurs de manière inégale : bleu de 0,0 à 0,3, vert à 0,6, rouge de 0,6 à 1,0.

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

Dégradé radial avec effet de lueur

Cet exemple dessine un dégradé radial simulant un effet de lueur. Le point de départ avec un rayon nul définit le centre de la lueur, et le cercle extérieur définit la limite d'atténuation. Cet effet est utilisé pour mettre en évidence des éléments d'interface ou des indicateurs d'activité.

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

Dégradé avec masque de détourage

Dans cet exemple, le dégradé est limité à une zone circulaire via un chemin de détourage. Avant de dessiner le dégradé, un chemin circulaire est défini, qui devient le masque actuel du contexte. Le dégradé remplit uniquement la zone à l'intérieur du cercle, créant un effet d'icône dégradée.

swift
func drawGradientInCircle(in ctx: CGContext,
                          rect: CGRect) {
    // Creating circular clip path
    let circlePath = CGMutablePath()
    circlePath.addEllipse(in: rect)
    ctx.addPath(circlePath)
    ctx.clip()

    // Drawing gradient inside clip mask
    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])
}

Foire Aux Questions

Quelle est la différence entre CGGradient et CAGradientLayer ?

CGGradient est un objet de bas niveau de Core Graphics pour le dessin dans un contexte graphique. CAGradientLayer est une couche de haut niveau de Core Animation avec animation automatique et accélération matérielle. CAGradientLayer est plus facile à utiliser avec UIKit, mais CGGradient offre un contrôle total et une compatibilité avec tout CGContext.

Combien de couleurs peut-on ajouter à CGGradient ?

Minimum est de 2 couleurs. La limite supérieure est uniquement contrainte par la mémoire disponible, car Core Graphics stocke un tableau de couleurs et une table d'interpolation précalculée. En pratique, plus de 10 à 15 couleurs dans un seul dégradé est inutile — la transition visuelle devient indiscernable d'une transition lisse.

Comment faire un dégradé avec transparence ?

Utilisez un CGColor avec un canal alpha inférieur à 1,0 dans le tableau de couleurs. Par exemple, une couleur avec transparence est créée comme UIColor(red: 0, green: 0, blue: 1, alpha: 0.5).cgColor. Core Graphics interpole le canal alpha tout comme les composants de couleur, créant une transition de transparence douce.

CGGradient fonctionne-t-il sur macOS ?

Oui, CGGradient fait partie de Core Graphics, disponible sur les deux plateformes : iOS et macOS. Sur macOS, le dégradé est dessiné dans n'importe quel NSView via la redéfinition de drawRect. Toutes les fonctions CGGradientCreateWithColors, CGContextDrawLinearGradient et CGContextDrawRadialGradient sont identiques sur les deux plateformes.

Comment faire pivoter un dégradé ?

Pour faire pivoter un dégradé, appliquez une transformation au contexte graphique avant de dessiner : CGContextRotateCTM(ctx, angle). Les points de départ et d'arrivée du dégradé sont spécifiés dans le système de coordonnées local du contexte après la transformation. Alternativement, vous pouvez calculer directement les coordonnées pivotées des points sans modifier la CTM.

Résumé

  • CGGradient est un objet immuable de Core Graphics pour les transitions de couleur douces
  • Dégradé linéaire est dessiné le long d'une ligne droite entre startPoint et endPoint via CGContextDrawLinearGradient
  • Dégradé radial est dessiné d'un cercle à un autre via CGContextDrawRadialGradient
  • Un dégradé est créé à partir d'un tableau de CGColor et d'un tableau de positions (0,0–1,0)
  • Les options d'extension kCGGradientDrawsBeforeStartLocation et kCGGradientDrawsAfterEndLocation contrôlent le remplissage en dehors de la plage
  • Masque de détourage restreint la zone de dessin du dégradé à un chemin arbitraire
  • Les transformations du contexte (CTM) affectent la position, l'échelle et la rotation du dégradé

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi