Core Graphics — Apple-dan 2D renderinq freymvorku, Core Foundation tərkibinə daxildir və iOS, macOS, tvOS və watchOS-da mövcuddur. O, vektor və rastr qrafikası ilə işləmək üçün aşağı səviyyəli C-API təmin edir, o cümlədən konturların, qradientlərin, kölgələrin, təsvirlərin və mətnin çəkilməsi. Core Graphics UIKit, SwiftUI və AppKit üçün əsas rolunu oynayır. Apple Developer Documentation, 2026 məlumatına görə, freymvork iOS tətbiqlərinin 90%-dən çoxunda istifadə olunur, çünki hər görünən element Core Graphics və ya onun aparat analoqundan keçir.
Əsas məqamlar
Core Graphics (Quartz 2D kimi də tanınır) — Apple-ın 2D qrafik mühərrikini həyata keçirən freymvorkdur. O, portativ Quartz qrafik kitabxanasına əsaslanır və səhifə əsaslı rəsm modelindən (page-based) istifadə edir, burada hər bir hərəkət kağız üzərində çəkməyi xatırladan ardıcıllıqda bir əmrdir. Core Graphics anti-aliasing, şəffaflıq (alpha compositing) və ICC rəng fəzalarını dəstəkləyir.
Core Graphics arxitekturası qrafik kontekst (CGContext) ətrafında qurulmuşdur, o hədəf çıxış cihazını — ekran, printer, PDF sənədi və ya rastr buferini inkapsulyasiya edir. Kontekst cari parametrləri idarə edir: rəng, xətt qalınlığı, transformasiya, kəsmə sahəsi və şriftlər. Bu yanaşma rəsm kodunu dəyişmədən müxtəlif çıxış cihazları üçün vahid API təmin edir.
Core Graphics əsasən CPU-da işləyir, vektor modelindən (resolution-independent) istifadə edərək. Bu o deməkdir ki, xətlər və əyrilər render zamanı cihazın cari rezolyusiyası ilə rastrlaşdırılır. Metal-dan fərqli olaraq, Core Graphics GPU resurslarının açıq idarə edilməsini tələb etmir — bütün optimallaşdırmanı sistem öz üzərinə götürür. Əksər 2D tapşırıqları (qrafika, diaqramlar, fərdi UI elementləri) üçün Core Graphics performansı 60 FPS saxlamaq üçün kifayətdir.
Core Graphics təxminən 50 əsas tipdən (opaque types) ibarətdir, hər biri müəyyən funksionallığa cavabdehdir. Bütün tiplər Core Foundation yaddaş idarəetmə qaydalarına əməl edir: adında Create olan funksiyalar vasitəsilə yaradılır, CGRelease çağırışı tələb edir və Objective-C-də ARC-uyğun deyil (lakin Swift CF_RETURNS_RETAINED annotasiyaları vasitəsilə yaddaşı avtomatik idarə edir).
CGContext — rəsm konteksti, freymvorkun mərkəzi tipi. CGPath — dəyişməz vektor konturu. CGColor — rəng fəzası göstərilən rəng. CGGradient — qradient doldurma. CGImage — rastr təsviri. CGLayer — təkrar çəkmə üçün optimallaşdırılmış oflayn bufer. CGDataProvider — təsvirlər üçün məlumat mənbəyi. CGColorSpace — rəng fəzası (sRGB, Display P3, Gray).
Hər tip minimal overhead üçün hazırlanmışdır: CGPath müxtəlif kontekstlər arasında keşlənə və təkrar istifadə oluna bilər, CGColor ötürülərkən GPU-nun aparat təmsilinə çevrilir, CGLayer əvvəlcədən rastrlaşdırılmış məzmunu saxlayır. Belə bir arxitektura Core Graphics-ın həm sadə UI tapşırıqlarında, həm də peşəkar qrafik redaktorlarında səmərəli işləməsinə imkan verir.
| Tip | Təyinat | Yaddaş idarəetməsi |
|---|---|---|
| CGContext | Qrafik kontekst | CFRelease və ya Swift-də avtomatik |
| CGPath | Vektor konturu | CFRelease (dəyişməz) |
| CGColor | Rəng fəzasında rəng | CFRelease və ya CGColorCreate |
| CGImage | Rastr təsviri | CFRelease (yaradıldıqdan sonra) |
| CGLayer | Oflayn bufer | CFRelease və ya CGLayerCreate |
CGPath — həndəsi seqmentlərin ardıcıllığını təsvir edən dəyişməz obyekt: düz xətlər, Bezier əyriləri, qövslər və bağlanmalar. UIBezierPath-dən fərqli olaraq, CGPath rəsm metodlarını ehtiva etmir — o yalnız həndəsəni saxlayır. Çəkmək üçün CGPath kontekstə əlavə edilir (CGContextAddPath) və sonra strokePath və ya fillPath vasitəsilə çəkilir. Dəyişməzlik thread təhlükəsizliyini və keşləmə imkanını təmin edir.
CGPathCreateMutable mərhələli qurma üçün dəyişən yol (CGMutablePathRef) yaradır. Son yığımadan sonra dəyişməz CGPathRef-ə çevrilir. Apple CGPath-də nöqtələrin sayını minimuma endirməyi tövsiyə edir — çox mürəkkəb konturlar (1000-dən çox seqment) rastrlaşdırmanı ləngidir. Optimallaşdırma üçün artıq kollinear nöqtələri silən CGPathCreateCopyBySimplifyingPath istifadə edin.
İki CGPath arasında forma animasiyası üçün CAShapeLayer-in path xüsusiyyətində CABasicAnimation istifadə edilə bilər. Məhdudiyyət: hər iki CGPath eyni sayda seqmentə (controls points) malik olmalıdır. CGPathApply funksiyası yolun bütün elementlərini keçməyə və onların strukturunu müqayisə etməyə imkan verir. Seqmentlər uyğun gəlmirsə, animasiya sıçrayışlı olacaq — bu halda nöqtələrin əl ilə interpolyasiyası üçün CADisplayLink istifadə edin.
// dəyişən yol yarat
let mutablePath = CGMutablePath()
mutablePath.moveTo(to: CGPoint(x: 0, y: 0))
mutablePath.addLine(to: CGPoint(x: 100, y: 0))
mutablePath.addLine(to: CGPoint(x: 100, y: 100))
mutablePath.closeSubpath()
// təhlükəsiz keşləmə üçün dəyişməzə çevir
let immutablePath: CGPath = mutablePath
CATransaction.perform {
shapeLayer.path = immutablePath
}
CGGradient — düz xətt boyunca (xətti qradient) və ya mərkəzdən kənarlara (radial qradient) iki və ya daha çox rəng arasında hamar keçidi təyin edən obyekt. CGGradient rəng fəzası, CGColorRef massivi və 0.0-dan 1.0-a qədər dayanma mövqeləri massivi göstərilməklə yaradılır. Yaradıldıqdan sonra qradient müxtəlif kontekstlərdə dəfələrlə istifadə edilə bilər.
CGShading — yol boyunca rəng dəyişmə funksiyasını təyin etməyə imkan verən daha güclü mexanizmdir. Sabit rəng dəsti ilə işləyən CGGradient-dən fərqli olaraq, CGShading hər nöqtədə rəngi hesablayan callback funksiyasından (CGFunctionRef) istifadə edir. Bu, qeyri-xətti keçidlər və mürəkkəb rəng sxemləri ilə mürəkkəb qradientlər yaratmağa imkan verir.
Fiqurun daxilində qradient çəkmək üçün həmin fiqurun konturunda clip tələb olunur. Sıra: kontekstə yol əlavə edin, CGContextClip çağırın, sonra qradienti çəkin. Clip olmadan qradient bütün konteksti doldurur. iOS-da daha sadə və məhsuldar variant kimi CGGradient istifadə etmək tövsiyə olunur — CGShading yalnız qeyri-standart rəng dəyişmə funksiyaları üçün əsaslandırılır.
func drawGradient(ctx: CGContext, rect: CGRect) {
let colors = [UIColor.red.cgColor, UIColor.blue.cgColor] as CFArray
guard let gradient = CGGradient(
colorsSpace: CGColorSpaceCreateDeviceRGB(),
colors: colors,
locations: [0.0, 1.0]
) else { return }
ctx.saveGState()
ctx.addEllipse(in: rect)
ctx.clip()
ctx.drawLinearGradient(
gradient,
start: CGPoint(x: rect.midX, y: rect.minY),
end: CGPoint(x: rect.midX, y: rect.maxY),
options: []
)
ctx.restoreGState()
}
CGImage — Core Graphics-da rastr təsviri, fayldan yüklənə, proqramlı şəkildə yaradıla və ya UIImage-dən əldə edilə bilər. CGImage piksel məlumatları, rəng fəzası, ölçü, bit dərinliyi və məlumat yerləşməsi haqqında məlumatları ehtiva edir. UIImage-dən fərqli olaraq, CGImage Retina üçün miqyaslamanı idarə etmir — bu məsuliyyəti proqramçı scale parametri vasitəsilə öz üzərinə götürür.
CGLayer — statik məzmunun əvvəlcədən rastrlaşdırılması üçün oflayn buferdir. Eyni qrafik əmrlər dəsti dəfələrlə çəkilirsə (məsələn, fon nümunəsi), CGLayer onu bir dəfə rastrlaşdırır və sonra sadəcə kontekstə kopyalayır. Apple məlumatlarına görə, CGLayer istifadəsi təkrar çəkməni CPU-da 2–5 dəfə, aparat sürətləndirilməsi ilə 10 dəfəyə qədər sürətləndirə bilər.
Təsvirləri yükləmək üçün CGImageSource istifadə edin — metadata, miniatürlər və GIF/APNG-dən ayrı-ayrı kadrları oxumaq üçün güclü API. CGImageSource təsviri proqressiv yükləməyə və yalnız lazımi fraqmentləri əldə etməyə imkan verir. Böyük təsvirlərlə (ekran ölçüsünü aşan) işləyərkən diskdə keşləmə seçimi ilə CGImageSource yaratmaq və kiçildilmiş versiyanı göstərmək üçün CGImageSourceCreateThumbnailAtIndex istifadə etmək tövsiyə olunur.
func createLayer(ctx: CGContext, size: CGSize) -> CGLayer? {
guard let layer = CGLayer(ctx, size: size, auxiliaryInfo: nil) else { return nil }
let layerCtx = layer.context !
// bir dəfə çək
layerCtx.setFillColor(UIColor.lightGray.cgColor)
layerCtx.addEllipse(in: CGRect(origin: .zero, size: size))
layerCtx.fillPath()
return layer
}
// draw() istifadəsi
for i in 0..<20 {
ctx.draw(layer, at: CGPoint(x: CGFloat(i) * 30, y: 0))
}
Core Graphics istifadə edərək təsvirdə su nişanı göstərmək üçün fərdi View hazırlayaq. Su nişanı orijinal təsvirin üzərinə qoyulmuş yarı şəffaf mətn və vektor loqosunu ehtiva edir. Kod bir kontekstdə CGContext, CGImage, mətn və şəffaflıqla işi nümayiş etdirir.
class WatermarkView: UIView {
private let watermarkText = "IT Sectr"
private let watermarkOpacity: CGFloat = 0.3
override func draw(_ rect: CGRect) {
guard let ctx = UIGraphicsGetCurrentContext() else { return }
// fon təsvirini çək
UIImage(named: "background")?.draw(in: rect)
// su nişanı şəffaflığını konfiqurasiya et
ctx.saveGState()
ctx.translateBy(x: rect.midX, y: rect.midY)
ctx.rotate(by: -.pi / 6)
// yarı şəffaf mətn
let attributes: NSAttributedString.Attributes = [
.font: UIFont.boldSystemFont(ofSize: 48),
.foregroundColor: UIColor.white.withAlphaComponent(watermarkOpacity)
]
let textSize = watermarkText.size(withAttributes: attributes)
watermarkText.draw(
at: CGPoint(x: -textSize.width / 2, y: -textSize.height / 2),
withAttributes: attributes
)
// mətnin altında vektor ikonu (dairə xaç ilə)
ctx.setStrokeColor(UIColor.white.withAlphaComponent(watermarkOpacity).cgColor)
ctx.setLineWidth(3)
ctx.addEllipse(in: CGRect(x: -25, y: -75, width: 50, height: 50))
ctx.strokePath()
ctx.moveTo(x: -15, y: -50)
ctx.addLineTo(x: 15, y: -50)
ctx.moveTo(x: 0, y: -65)
ctx.addLineTo(x: 0, y: -35)
ctx.strokePath()
ctx.restoreGState()
}
}
Kodda Core Graphics-ın əsas imkanlarından istifadə olunub: saveGState/restoreGState su nişanı effektlərini fondan təcrid etmək üçün, translateBy və rotate yerləşdirmə və döndərmə üçün, withAlphaComponent vasitəsilə yarı şəffaf mətn və addEllipse və addLineTo vasitəsilə vektor ikonu. Bütün su nişanı fon təsvirindən sonra vahid kompozisiya kimi çəkilir.
İstehsalda fotoşəkillər üçün su nişanları yaradarkən performansı nəzərə almaq vacibdir. Təsvir ekrandan böyükdürsə, su nişanını tətbiq etməzdən əvvəl onu CGImageSourceCreateThumbnailAtIndex vasitəsilə kiçildin. Core Graphics bütün əməliyyatları CPU-da emal edir — onlarla təsvirin toplu emalı üçün UI bloklanmasının qarşısını almaq üçün fon növbəsi və CGBitmapContext istifadə edin.
Tez-tez verilən suallar
UIKit — yüksək səviyyəli UI freymvorku, renderinq üçün daxilində Core Graphics istifadə edir. Core Graphics — 2D qrafika üçün aşağı səviyyəli C-API. UIKit standart elementlər üçün daha rahatdır, Core Graphics hər piksel üzərində tam nəzarət verir.
Core Graphics statik 2D qrafika, diaqramlar və fərdi UI elementləri üçün uyğundur. Metal — 3D qrafika, mürəkkəb animasiyalar və GPU sürətləndirilməsi ilə böyük piksel massivlərinin emalı üçün. UI tapşırıqlarının 95%-i üçün Core Graphics kifayətdir.
Tam yükləmə əvəzinə miniatürləri yükləmək üçün CGImageSource-dan createThumbnailAtIndex vasitəsilə istifadə edin. Böyük təsvirləri göstərmək üçün downsample seçimi ilə CGImage yaradın. CGImage artıq lazım olmadıqda CGImageRelease vasitəsilə azad edin.
Bəli, Core Graphics oxumaq üçün CGPDFDocument və PDF sənədləri yaratmaq üçün CGPDFContext vasitəsilə tam PDF dəstəyi daxildir. İstənilən CGContext məzmununu vektorları saxlayaraq birbaşa PDF səhifəsinə çəkmək olar.
Core Graphics ekranda render edərkən avtomatik olaraq cihazın rezolyusiyasından istifadə edir. Oflayn kontekstlər üçün scale = 0 parametri ilə (sistem miqyası) UIGraphicsBeginImageContextWithOptions istifadə edin və ya Retina/Retina HD üçün açıq şəkildə 2.0/3.0 göstərin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun