Core Graphics — az Apple 2D megjelenítő keretrendszere, a Core Foundation része és elérhető iOS, macOS, tvOS és watchOS rendszereken. Alacsony szintű C-API-t biztosít vektoros és raszteres grafika kezeléséhez, beleértve kontúrok, gradiensek, árnyékok, képek és szövegek rajzolását. A Core Graphics képezi az alapját a UIKit, SwiftUI és AppKit keretrendszereknek. A Apple Developer Documentation, 2026 szerint a keretrendszert az iOS-alkalmazások több mint 90%-a használja, mivel minden látható elem áthalad a Core Graphics-on vagy annak hardveres megfelelőjén.
Főbb pontok
Core Graphics (más néven Quartz 2D) egy keretrendszer, amely az Apple 2D grafikus motorját valósítja meg. A hordozható Quartz grafikus könyvtáron alapul, és oldal alapú rajzolási modellt (page-based) használ, ahol minden művelet egy parancs egy sorozatban, amely a papírra rajzolásra emlékeztet. A Core Graphics támogatja az anti-aliasingot, az átlátszóságot (alpha compositing) és az ICC színtereket.
A Core Graphics architektúrája a grafikus kontextus (CGContext) köré épül, amely beágyazza a célkimeneti eszközt — képernyő, nyomtató, PDF dokumentum vagy raszteres puffer. A kontextus kezeli az aktuális beállításokat: szín, vonalvastagság, transzformáció, vágási terület és betűtípusok. Ez a megközelítés egységes API-t biztosít a különböző kimeneti eszközökhöz a rajzolási kód megváltoztatása nélkül.
A Core Graphics főként a CPU-n működik, vektoros modellt (resolution-independent) használva. Ez azt jelenti, hogy a vonalak és görbék a megjelenítés során az eszköz aktuális felbontásával raszterizálódnak. Ellentétben a Metal-lel, a Core Graphics nem igényel explicit GPU-erőforrás kezelést — a rendszer átvesz minden optimalizálást. A legtöbb 2D feladathoz (grafika, diagramok, egyedi UI elemek) a Core Graphics teljesítménye elegendő a 60 FPS fenntartásához.
Core Graphics körülbelül 50 alapvető típust (opaque types) tartalmaz, amelyek mindegyike egy adott funkcióért felelős. Minden típus követi a Core Foundation memóriakezelési szabályait: Create nevű függvényekkel jön létre, CGRelease hívást igényel, és nem ARC-kompatibilis Objective-C-ben (bár a Swift automatikusan kezeli a memóriát CF_RETURNS_RETAINED annotációkon keresztül).
CGContext — rajzolási kontextus, a keretrendszer központi típusa. CGPath — megváltoztathatatlan vektoros kontúr. CGColor — szín a színtér megadásával. CGGradient — gradiens kitöltés. CGImage — raszteres kép. CGLayer — optimalizált offline puffer ismétlődő rajzoláshoz. CGDataProvider — adatforrás képekhez. CGColorSpace — színtér (sRGB, Display P3, Gray).
Minden típus minimális többletterhelésre tervezett: a CGPath gyorsítótárazható és újrafelhasználható különböző kontextusok között, a CGColor átvitelkor a GPU hardveres reprezentációjává alakul, a CGLayer előre raszterizált tartalmat tárol. Ez az architektúra lehetővé teszi a Core Graphics számára, hogy hatékonyan működjön mind egyszerű UI feladatokban, mind professzionális grafikus szerkesztőkben.
| Típus | Rendeltetés | Memóriakezelés |
|---|---|---|
| CGContext | Grafikus kontextus | CFRelease vagy automatikus Swift-ben |
| CGPath | Vektoros kontúr | CFRelease (megváltoztathatatlan) |
| CGColor | Szín színtérben | CFRelease vagy CGColorCreate |
| CGImage | Raszteres kép | CFRelease (létrehozás után) |
| CGLayer | Offline puffer | CFRelease vagy CGLayerCreate |
CGPath — egy megváltoztathatatlan objektum, amely geometriai szegmensek sorozatát írja le: egyenes vonalak, Bézier-görbék, ívek és zárások. Ellentétben az UIBezierPath-vel, a CGPath nem tartalmaz rajzolási metódusokat — csak a geometriát tárolja. Rajzoláshoz a CGPath hozzáadásra kerül a kontextushoz (CGContextAddPath), majd a strokePath vagy fillPath segítségével rajzolódik ki. A megváltoztathatatlanság garantálja a szálbiztonságot és a gyorsítótárazási lehetőséget.
CGPathCreateMutable létrehoz egy változtatható útvonalat (CGMutablePathRef) a szakaszos felépítéshez. A végső összeállítás után megváltoztathatatlan CGPathRef-é alakul. Az Apple javasolja a pontok számának minimalizálását a CGPath-ben — a túl bonyolult kontúrok (több mint 1000 szegmens) lassítják a raszterizálást. Optimalizáláshoz használja a CGPathCreateCopyBySimplifyingPath függvényt, amely eltávolítja a felesleges kollineáris pontokat.
Két CGPath közötti alakzat animációhoz használhatja a CABasicAnimation-t a CAShapeLayer path tulajdonságán. Korlátozás: mindkét CGPath-nek azonos számú szegmenssel kell rendelkeznie (controls points). A CGPathApply függvény lehetővé teszi az útvonal összes elemének bejárását és szerkezetük összehasonlítását. Ha a szegmensek nem egyeznek, az animáció szaggatott lesz — ebben az esetben használja a CADisplayLink-et a pontok manuális interpolációjához.
// változtatható útvonal létrehozása
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()
// átalakítás megváltoztathatatlanná biztonságos gyorsítótárazáshoz
let immutablePath: CGPath = mutablePath
CATransaction.perform {
shapeLayer.path = immutablePath
}
CGGradient — egy objektum, amely sima átmenetet definiál két vagy több szín között egy egyenes mentén (lineáris gradiens) vagy a középponttól a szélek felé (radiális gradiens). A CGGradient a színtér, egy CGColorRef tömb és egy 0.0-tól 1.0-ig tartó megállási pozíció tömb megadásával jön létre. Létrehozás után a gradiens többször használható különböző kontextusokban.
CGShading — egy erősebb mechanizmus, amely lehetővé teszi a színváltozási függvény meghatározását egy útvonal mentén. Ellentétben a CGGradient-tel, amely fix színkészlettel dolgozik, a CGShading egy visszahívási függvényt (CGFunctionRef) használ, amely minden pontban kiszámítja a színt. Ez lehetővé teszi összetett gradiensek létrehozását nemlineáris átmenetekkel és összetett színsémákkal.
A gradiens rajzolásához egy alakzaton belül clip szükséges az alakzat kontúrján. Sorrend: adja hozzá az útvonalat a kontextushoz, hívja meg a CGContextClip-et, majd rajzolja ki a gradienst. Clip nélkül a gradiens kitölti a teljes kontextust. iOS-ben ajánlott a CGGradient használata egyszerűbb és hatékonyabb lehetőségként — a CGShading csak nem szabványos színváltozási függvények esetén indokolt.
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 — raszteres kép a Core Graphics-ban, amely betölthető fájlból, programozottan létrehozható vagy UIImage-ből nyerhető. A CGImage pixeleket, színtér-információt, méretet, bitmélységet és adatelrendezést tartalmaz. Ellentétben az UIImage-lel, a CGImage nem kezeli a Retina méretezést — ezt a felelősséget a fejlesztő veszi át a scale paraméteren keresztül.
CGLayer — offline puffer statikus tartalom előzetes raszterizálásához. Ha ugyanaz a grafikus parancskészlet többször rajzolódik ki (pl. háttérminta), a CGLayer egyszer raszterizálja, majd egyszerűen bemásolja a kontextusba. Az Apple adatai szerint a CGLayer használata 2–5-szörösére gyorsíthatja az ismétlődő rajzolást CPU-n és akár 10-szeresére hardveres gyorsítással.
Képek betöltéséhez használja a CGImageSource-t — egy hatékony API-t metaadatok, miniatűrök és egyes képkockák olvasásához GIF/APNG formátumból. A CGImageSource lehetővé teszi a kép progresszív betöltését és csak a szükséges részek lekérését. Nagy képekkel (képernyőméretet meghaladó) való munka során ajánlott lemezgyorsítótárazási opcióval rendelkező CGImageSource létrehozása és a CGImageSourceCreateThumbnailAtIndex használata a kicsinyített változat megjelenítéséhez.
func createLayer(ctx: CGContext, size: CGSize) -> CGLayer? {
guard let layer = CGLayer(ctx, size: size, auxiliaryInfo: nil) else { return nil }
let layerCtx = layer.context !
// egyszer rajzol
layerCtx.setFillColor(UIColor.lightGray.cgColor)
layerCtx.addEllipse(in: CGRect(origin: .zero, size: size))
layerCtx.fillPath()
return layer
}
// használat a draw()-ban
for i in 0..<20 {
ctx.draw(layer, at: CGPoint(x: CGFloat(i) * 30, y: 0))
}
Kifejlesztünk egy egyedi View-t vízjel megjelenítéséhez egy képen Core Graphics segítségével. A vízjel tartalmaz félig átlátszó szöveget és vektoros logót, amely az eredeti kép fölé kerül. A kód bemutatja a CGContext, CGImage, szöveg és átlátszóság kezelését egy kontextusban.
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 }
// háttérkép rajzolása
UIImage(named: "background")?.draw(in: rect)
// vízjel átlátszóságának beállítása
ctx.saveGState()
ctx.translateBy(x: rect.midX, y: rect.midY)
ctx.rotate(by: -.pi / 6)
// félig átlátszó szöveg
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
)
// vektoros ikon (kör kereszttel) a szöveg alatt
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()
}
}
A kódban a Core Graphics kulcsfontosságú képességei kerülnek felhasználásra: saveGState/restoreGState a vízjel hatásainak elkülönítésére a háttértől, translateBy és rotate a pozicionáláshoz és forgatáshoz, félig átlátszó szöveg a withAlphaComponent segítségével és vektoros ikon az addEllipse és addLineThrough használatával. Az egész vízjel egyetlen kompozícióként rajzolódik ki a háttérkép után.
A vízjelek készítésekor fotókhoz éles környezetben fontos figyelembe venni a teljesítményt. Ha a kép nagyobb, mint a képernyő, a vízjel alkalmazása előtt kicsinyítse le a CGImageSourceCreateThumbnailAtIndex segítségével. A Core Graphics minden műveletet a CPU-n dolgoz fel — tucatnyi kép kötegelt feldolgozásához használjon háttérsort és CGBitmapContext-et az UI blokkolásának elkerüléséhez.
Gyakran Ismételt Kérdések
UIKit — magas szintű UI keretrendszer, amely belsőleg a Core Graphics-ot használja megjelenítéshez. Core Graphics — alacsony szintű C-API 2D grafikához. A UIKit kényelmesebb a szabványos elemekhez, a Core Graphics teljes kontrollt biztosít minden pixel felett.
Core Graphics alkalmas statikus 2D grafikához, diagramokhoz és egyedi UI elemekhez. Metal — 3D grafikához, összetett animációkhoz és nagy pixel tömbök feldolgozásához GPU-gyorsítással. Az UI feladatok 95%-ához elegendő a Core Graphics.
Használja a CGImageSource-t miniatűrök betöltéséhez a createThumbnailAtIndex segítségével a teljes betöltés helyett. Nagy képek megjelenítéséhez hozzon létre CGImage-t downsample opcióval. Szabadítsa fel a CGImage-t CGImageRelease segítségével, amikor már nincs rá szükség.
Igen, a Core Graphics teljes PDF-támogatást tartalmaz a CGPDFDocument segítségével olvasáshoz és a CGPDFContext segítségével PDF dokumentumok létrehozásához. Bármilyen CGContext tartalmat közvetlenül PDF oldalra rajzolhat a vektorok megtartásával.
A Core Graphics automatikusan használja az eszköz felbontását képernyőn történő megjelenítéskor. Offline kontextusokhoz használja a UIGraphicsBeginImageContextWithOptions függvényt scale = 0 paraméterrel (rendszerméretarány) vagy adja meg explicit 2.0/3.0 értéket Retina/Retina HD esetén.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is