CGGradient es un objeto de Core Graphics que representa una transición suave entre dos o más colores. A diferencia de dibujar un degradado mediante un bucle con cambios de color, CGGradient utiliza un cálculo acelerado por hardware y admite dos tipos: lineal (axial) y radial. Según la Documentación de Apple (2026), CGGradient se utiliza para crear rellenos realistas, efectos de fondo y simular fuentes de luz en interfaces de iOS y macOS.
Ideas Clave
CGGradient es un objeto inmutable en Core Graphics que encapsula un conjunto de colores y reglas para combinarlos a lo largo de una transición degradada. Internamente, CGGradient almacena una matriz de CGColor, una matriz de posiciones (locations) en el rango [0.0, 1.0] y una referencia al CGColorSpace en el que se interpretan los colores. Cada color está asociado con una posición en la escala del degradado: la posición 0.0 corresponde al inicio, 1.0 al final de la transición.
Al crear un CGGradient mediante la función CGGradientCreateWithColors, Core Graphics precalcula los valores de color intermedios. Un degradado puede contener una cantidad arbitraria de paradas de color (color stops), lo que permite transiciones complejas de múltiples colores. El número de colores debe ser al menos dos, y cada color debe corresponder a una posición en la matriz de locations.
La arquitectura de CGGradient se diferencia de las API de nivel superior, como CAGradientLayer de Core Animation, en que trabaja directamente en el contexto de Core Graphics. Esto proporciona un control total sobre el proceso de dibujo y la capacidad de combinar degradados con otras operaciones de Quartz 2D: máscaras de recorte, sombras y transformaciones.
Core Graphics admite dos tipos de degradados: lineal (axial) y radial. Un degradado lineal se crea con la función CGGradientCreateWithColors y se dibuja con CGContextDrawLinearGradient. Un degradado radial requiere la misma estructura CGGradient pero se dibuja con CGContextDrawRadialGradient.
| Tipo | Función de dibujo | Parámetros | Uso |
|---|---|---|---|
| Lineal | CGContextDrawLinearGradient | startPoint, endPoint, options | Fondos, botones, barras de progreso |
| Radial | CGContextDrawRadialGradient | startCenter, startRadius, endCenter, endRadius, options | Destellos, fuentes de luz, sombras |
Degradado lineal extiende la transición de color a lo largo de una línea recta desde el punto inicial startPoint hasta el punto final endPoint. Los colores se interpolan entre estos dos puntos, y el comportamiento más allá de ellos se controla mediante las opciones de extensión. El degradado lineal es ideal para crear fondos suaves, simular superficies metálicas y transiciones de color en elementos de interfaz.
Degradado radial crea una transición de color de un círculo a otro. Cada círculo se define por un centro (startCenter / endCenter) y un radio (startRadius / endRadius). El color se interpola desde el círculo interior al exterior. Un caso especial es cuando el radio inicial es 0: el degradado se irradia desde un solo punto. Los degradados radiales se utilizan para simular fuentes de luz, lentes, cuerpos celestes y efectos de foco.
CGGradient se crea con una única función base: CGGradientCreateWithColors. La función recibe un CGColorSpace, una matriz de CGColor (CFArray) y una matriz de CGFloat locations. Si locations es NULL, los colores se distribuyen uniformemente a lo largo de la escala del degradado. Si se especifican locations, su cantidad debe coincidir con el número de colores.
La matriz locations contiene valores de 0.0 a 1.0 que definen los puntos de parada de cada color. Los valores deben aumentar de forma monótona. Si el primer valor es mayor que 0.0, el color desde el inicio hasta esta posición se extrapola a partir del color en la posición 0.0. De manera similar para el último valor menor que 1.0. Este comportamiento se controla mediante las opciones de extensión durante el dibujo.
Al elegir colores para un degradado, es importante considerar el espacio de color. Todos los colores en un mismo CGGradient deben pertenecer al mismo CGColorSpace — Core Graphics interpola los componentes en ese espacio. Si los colores se crean en espacios diferentes, deben convertirse primero a un espacio común mediante CGColorCreateCopyByMatchingToColorSpace.
Core Graphics proporciona dos funciones para dibujar un degradado: CGContextDrawLinearGradient para lineal y CGContextDrawRadialGradient para radial. Ambas funciones aceptan un contexto gráfico, un objeto CGGradient, opciones de extensión y parámetros geométricos específicos del tipo. El dibujo se realiza teniendo en cuenta la máscara de recorte actual y la transformación del contexto.
Las opciones de extensión controlan el comportamiento del degradado más allá del rango de posiciones 0.0–1.0. La constante kCGGradientDrawsBeforeStartLocation rellena el área antes de la posición inicial con el color de la primera parada. kCGGradientDrawsAfterEndLocation rellena con el color de la última parada. Estas opciones se pueden combinar mediante una máscara de bits. Para degradados radiales, las opciones se aplican al área más allá de los radios inicial y final.
El degradado se dibuja en el sistema de coordenadas del contexto gráfico actual, teniendo en cuenta su transformación (CTM — Current Transformation Matrix). La aplicación de CGContextTranslateCTM, CGContextScaleCTM o CGContextRotateCTM antes de llamar a la función de dibujo cambia la posición y la escala del degradado. Esto permite reutilizar un único CGGradient para diferentes áreas sin crear nuevos objetos.
Core Graphics proporciona varios mecanismos adicionales para controlar los degradados: suavizado (antialiasing), enmascaramiento mediante máscara de recorte (clipping mask) y combinación con efectos de transparencia. El suavizado está activado por defecto en el contexto gráfico y se controla mediante CGContextSetShouldAntialias.
Máscara de recorte permite restringir el área de dibujo del degradado a una forma arbitraria. Antes de llamar a CGContextDrawLinearGradient, es necesario definir un trazado mediante CGContextBeginPath, CGContextAddPath y CGContextClip. El degradado se dibuja solo dentro del área delimitada por este trazado. Esto se usa ampliamente para crear iconos degradados, botones y barras de progreso.
Extensión del degradado es otro parámetro importante. Al usar kCGGradientDrawsBeforeStartLocation, Core Graphics extrapola el color de la primera parada a toda el área antes de startPoint. Sin esta opción, el área fuera del degradado permanece sin relleno (transparente). La combinación de ambas opciones garantiza que todo el rectángulo del contexto gráfico se rellene con un degradado, incluso si startPoint y endPoint están dentro de él.
Veamos ejemplos prácticos de creación y dibujo de degradados en iOS usando CGGradient y Core Graphics.
Este ejemplo crea un degradado lineal con tres colores (azul, verde, rojo) y lo dibuja en diagonal a través de un UIView. La matriz locations distribuye los colores de manera desigual: azul de 0.0 a 0.3, verde en 0.6, rojo de 0.6 a 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])
}
Este ejemplo dibuja un degradado radial que simula un efecto de brillo. El punto inicial con radio cero define el centro del brillo, y el círculo exterior define el límite de atenuación. Este efecto se utiliza para resaltar elementos de la interfaz o indicadores de actividad.
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])
}
En este ejemplo, el degradado se limita a un área circular mediante un trazado de recorte. Antes de dibujar el degradado, se define un trazado circular que se convierte en la máscara actual del contexto. El degradado rellena solo el área dentro del círculo, creando un efecto de icono degradado.
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])
}
Preguntas Frecuentes
CGGradient es un objeto de bajo nivel de Core Graphics para dibujar en un contexto gráfico. CAGradientLayer es una capa de alto nivel de Core Animation con animación automática y aceleración por hardware. CAGradientLayer es más fácil de usar con UIKit, pero CGGradient proporciona control total y compatibilidad con cualquier CGContext.
Mínimo son 2 colores. El límite superior solo está restringido por la memoria disponible, ya que Core Graphics almacena una matriz de colores y una tabla de interpolación precalculada. En la práctica, más de 10–15 colores en un solo degradado es innecesario: la transición visual se vuelve indistinguible de una suave.
Use un CGColor con un canal alfa menor de 1.0 en la matriz de colores. Por ejemplo, un color con transparencia se crea como UIColor(red: 0, green: 0, blue: 1, alpha: 0.5).cgColor. Core Graphics interpola el canal alfa igual que los componentes de color, creando una transición de transparencia suave.
Sí, CGGradient es parte de Core Graphics, disponible en ambas plataformas: iOS y macOS. En macOS, el degradado se dibuja en cualquier NSView sobrescribiendo drawRect. Todas las funciones CGGradientCreateWithColors, CGContextDrawLinearGradient y CGContextDrawRadialGradient son idénticas en ambas plataformas.
Para rotar un degradado, aplique una transformación al contexto gráfico antes de dibujar: CGContextRotateCTM(ctx, angle). Los puntos inicial y final del degradado se especifican en el sistema de coordenadas local del contexto después de la transformación. Alternativamente, puede calcular las coordenadas rotadas de los puntos directamente sin cambiar la CTM.
Resumen
CGContextDrawLinearGradientCGContextDrawRadialGradientDesarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también