CGGradient — ay isang Core Graphics object na kumakatawan sa isang makinis na paglipat sa pagitan ng dalawa o higit pang mga kulay. Hindi tulad ng pagguhit ng gradient sa pamamagitan ng loop na may pagbabago ng kulay, ang CGGradient ay gumagamit ng hardware-accelerated na pag-compute at sumusuporta sa dalawang uri: linear (axial) at radial (radial). Ayon sa Apple Documentation (2026), ang CGGradient ay ginagamit para sa paglikha ng makatotohanang mga fill, background effect, at simulation ng mga light source sa iOS at macOS interface.
Mga Pangunahing Punto
CGGradient — ay isang hindi nababagong object sa Core Graphics, na nag-encapsulate ng isang set ng mga kulay at mga patakaran ng kanilang paghahalo sa kahabaan ng gradient transition. Sa loob, ang CGGradient ay nag-iimbak ng isang array ng CGColor, isang array ng mga posisyon (locations) sa saklaw na [0.0, 1.0], at isang reference sa CGColorSpace kung saan ang mga kulay ay binibigyang-kahulugan. Ang bawat kulay ay nakatali sa isang posisyon sa scale ng gradient: posisyon 0.0 ay tumutugma sa simula, 1.0 — sa dulo ng transition.
Sa paglikha ng CGGradient sa pamamagitan ng function na CGGradientCreateWithColors, ang Core Graphics ay nagsasagawa ng pre-computation ng mga intermediate na halaga ng kulay. Ang gradient ay maaaring maglaman ng anumang bilang ng mga color stops, na nagpapahintulot sa paglikha ng mga kumplikadong multi-color na transition. Ang bilang ng mga kulay ay dapat na hindi bababa sa dalawa, at ang bawat kulay ay dapat may katumbas na posisyon sa locations array.
Ang arkitektura ng CGGradient ay naiiba mula sa mas mataas na antas ng API tulad ng CAGradientLayer mula sa Core Animation dahil ito ay direktang gumagana sa graphic na konteksto ng Core Graphics. Nagbibigay ito ng ganap na kontrol sa proseso ng pagguhit at kakayahang pagsamahin ang mga gradient sa iba pang mga operasyon ng Quartz 2D — clipping mask, shadow, at mga transformasyon.
Core Graphics ay sumusuporta sa dalawang uri ng gradient: linear (axial) at radial (radial). Ang linear gradient ay ginawa ng function na CGGradientCreateWithColors at iginuhit sa pamamagitan ng CGContextDrawLinearGradient. Ang radial gradient ay nangangailangan ng parehong CGGradient structure, ngunit iginuhit sa pamamagitan ng CGContextDrawRadialGradient.
| Uri | Function ng pagguhit | Mga parameter | Paggamit |
|---|---|---|---|
| Linear | CGContextDrawLinearGradient | startPoint, endPoint, options | Background, mga button, progress bar |
| Radial | CGContextDrawRadialGradient | startCenter, startRadius, endCenter, endRadius, options | Mga glow, light source, anino |
Linear gradient ay nagpapahaba ng paglipat ng kulay sa kahabaan ng tuwid na linya mula sa simula na punto startPoint hanggang sa dulo na punto endPoint. Ang mga kulay ay ini-interpolate sa pagitan ng dalawang puntong ito, at sa labas ng kanilang mga hangganan, ang pag-uugali ay kinokontrol ng mga opsyon sa extension. Ang linear gradient ay perpekto para sa paglikha ng makinis na background, simulation ng metal na ibabaw, at paglipat ng kulay sa mga elemento ng interface.
Radial gradient ay lumilikha ng paglipat ng kulay mula sa isang bilog patungo sa isa pa. Ang bawat bilog ay tinutukoy ng gitna (startCenter / endCenter) at radius (startRadius / endRadius). Ang kulay ay ini-interpolate mula sa panloob na bilog patungo sa panlabas. Isang espesyal na kaso — kapag ang simula radius ay 0: ang gradient ay kumakalat mula sa isang punto. Ang mga radial gradient ay ginagamit para sa simulation ng light source, lens, celestial body, at spotlight effect.
CGGradient ay ginawa lamang ng isang pangunahing function — CGGradientCreateWithColors. Ang function ay tumatanggap ng CGColorSpace, isang array ng CGColor (CFArray), at isang array ng CGFloat locations. Kung ang locations ay NULL, ang mga kulay ay pantay na ipinamamahagi sa kahabaan ng gradient scale. Kung ang locations ay tinukoy, ang haba nito ay dapat tumugma sa bilang ng mga kulay.
Ang locations array ay naglalaman ng mga halaga mula 0.0 hanggang 1.0, na tumutukoy sa mga stop point ng bawat kulay. Ang mga halaga ay dapat na monotonically tumaas. Kung ang unang halaga ay mas malaki kaysa sa 0.0, ang kulay mula sa simula hanggang sa posisyong ito ay i-extrapolate mula sa kulay sa posisyon 0.0. Katulad para sa huling halaga na mas mababa sa 1.0. Ang pag-uugali na ito ay kinokontrol ng mga opsyon sa extension sa pagguhit.
Sa pagpili ng mga kulay para sa gradient, mahalagang isaalang-alang ang color space. Lahat ng mga kulay sa isang CGGradient ay dapat na kabilang sa parehong CGColorSpace — ang Core Graphics ay nagsasagawa ng interpolation ng mga component sa puwang na ito. Kung ang mga kulay ay ginawa sa iba't ibang mga puwang, dapat silang i-convert sa isang karaniwang puwang sa pamamagitan ng CGColorCreateCopyByMatchingToColorSpace.
Core Graphics ay nagbibigay ng dalawang function para sa pagguhit ng gradient: CGContextDrawLinearGradient para sa linear at CGContextDrawRadialGradient para sa radial. Ang parehong function ay tumatanggap ng graphic context, CGGradient object, mga opsyon sa extension, at mga geometric na parameter na tukoy sa uri. Ang pagguhit ay isinasagawa na isinasaalang-alang ang kasalukuyang clipping mask (clip) at context transformation.
Mga opsyon sa extension ay kinokontrol ang pag-uugali ng gradient sa labas ng saklaw ng mga posisyon 0.0–1.0. Ang constant kCGGradientDrawsBeforeStartLocation ay pumupuno sa lugar bago ang simula na posisyon ng kulay ng unang stop. kCGGradientDrawsAfterEndLocation — ng kulay ng huling stop. Ang mga opsyon na ito ay maaaring pagsamahin sa pamamagitan ng bit mask. Para sa radial gradient, ang mga opsyon ay inilalapat sa lugar sa labas ng simula at dulo na radius.
Ang gradient ay iginuhit sa coordinate system ng kasalukuyang graphic context na isinasaalang-alang ang transformasyon nito (CTM — Current Transformation Matrix). Ang paglalapat ng CGContextTranslateCTM, CGContextScaleCTM, o CGContextRotateCTM bago tawagan ang function ng pagguhit ay nagbabago sa posisyon at scale ng gradient. Ito ay nagpapahintulot sa muling paggamit ng isang CGGradient para sa iba't ibang lugar nang hindi lumilikha ng mga bagong object.
Core Graphics ay nagbibigay ng ilang karagdagang mekanismo para sa pamamahala ng mga gradient: anti-aliasing, masking sa pamamagitan ng clipping mask, at kombinasyon sa mga epekto ng transparency. Ang anti-aliasing ay naka-enable bilang default sa graphic context at kinokontrol sa pamamagitan ng CGContextSetShouldAntialias.
Clipping mask ay nagpapahintulot na limitahan ang lugar ng pagguhit ng gradient sa isang arbitrary na hugis. Bago tawagan ang CGContextDrawLinearGradient, isang contour ay dapat na tukuyin sa pamamagitan ng CGContextBeginPath, CGContextAddPath, at CGContextClip. Ang gradient ay iguguhit lamang sa loob ng lugar na nilimitahan ng contour na ito. Ito ay malawakang ginagamit para sa paglikha ng gradient icon, button, at progress bar.
Extension ng gradient (extend) — isa pang mahalagang parameter. Kapag gumagamit ng kCGGradientDrawsBeforeStartLocation, ang Core Graphics ay nag-extrapolate ng kulay ng unang stop sa buong lugar hanggang startPoint. Kung wala ang opsyon na ito, ang lugar sa labas ng gradient ay mananatiling hindi napupuno (transparent). Ang kombinasyon ng parehong opsyon ay ginagarantiyahan na ang buong rectangle ng graphic context ay mapupuno ng gradient, kahit na ang startPoint at endPoint ay nasa loob nito.
Tingnan natin ang mga praktikal na halimbawa ng paglikha at pagguhit ng mga gradient sa iOS gamit ang CGGradient at Core Graphics.
Ang halimbawa ay gumagawa ng linear gradient na may tatlong kulay (asul, berde, pula) at iginuguhit ito nang pahilis sa UIView. Ang locations array ay namamahagi ng mga kulay nang hindi pantay: asul mula 0.0 hanggang 0.3, berde sa 0.6, pula mula 0.6 hanggang 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])
}
Ang halimbawa ay gumuhit ng radial gradient na ginagaya ang glow. Ang simula na punto na may zero radius ay tumutukoy sa sentro ng glow, at ang panlabas na bilog — ang hangganan ng pagkupas. Ang ganitong epekto ay ginagamit para sa pag-iilaw ng mga elemento ng interface o mga indicator ng aktibidad.
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])
}
Sa halimbawang ito, ang gradient ay nililimitahan sa isang pabilog na lugar sa pamamagitan ng clipping contour. Bago iguhit ang gradient, isang pabilog na path ang tinutukoy na nagiging kasalukuyang mask ng konteksto. Pinupuno lamang ng gradient ang lugar sa loob ng bilog, na lumilikha ng epekto ng gradient icon.
func drawGradientInCircle(in ctx: CGContext,
rect: CGRect) {
// Paglikha ng pabilog na clipping path
let circlePath = CGMutablePath()
circlePath.addEllipse(in: rect)
ctx.addPath(circlePath)
ctx.clip()
// Pagguhit ng gradient sa loob ng clipping 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])
}
Mga Madalas Itanong
CGGradient — ay isang mababang antas na Core Graphics object para sa pagguhit sa graphic context. CAGradientLayer — ay isang mataas na antas na Core Animation layer na may awtomatikong animation at hardware acceleration. Ang CAGradientLayer ay mas madaling gamitin para sa UIKit, ngunit ang CGGradient ay nagbibigay ng ganap na kontrol at compatibility sa anumang CGContext.
Pinakamababang bilang — 2 kulay. Ang itaas na hangganan ay limitado lamang ng available na memorya, dahil ang Core Graphics ay nag-iimbak ng array ng mga kulay at pre-computed na interpolation table. Sa praktika, higit sa 10–15 kulay sa isang gradient ay hindi praktikal — ang visual transition ay nagiging hindi nakikilala mula sa makinis.
Gumamit ng CGColor na may alpha channel na mas mababa sa 1.0 sa array ng mga kulay. Halimbawa, ang kulay na may transparency ay ginagawa bilang UIColor(red: 0, green: 0, blue: 1, alpha: 0.5).cgColor. Ang Core Graphics ay nag-i-interpolate ng alpha channel tulad ng mga color component, na lumilikha ng makinis na transition ng transparency.
Oo, ang CGGradient ay bahagi ng Core Graphics, available sa parehong platform: iOS at macOS. Sa macOS, ang gradient ay iginuhit sa anumang NSView sa pamamagitan ng pag-override ng drawRect. Lahat ng function na CGGradientCreateWithColors, CGContextDrawLinearGradient, at CGContextDrawRadialGradient ay magkapareho sa parehong platform.
Upang paikutin ang gradient, maglapat ng transformasyon sa graphic context bago gumuhit: CGContextRotateCTM(ctx, angle). Ang start at end point ng gradient ay tinutukoy sa lokal na coordinate system ng context pagkatapos ng transformasyon. Bilang alternatibo, ang mga rotated coordinate ng mga punto ay maaaring direktang kalkulahin nang hindi binabago ang CTM.
Buod
CGContextDrawLinearGradientCGContextDrawRadialGradientGagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din