En introduksjon til Quartz 2D

An Introduksjon til Quartz 2D
20
Del
8
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

Hva er Quartz 2D?

Quartz 2D er Apples 2D tegning motor, en viktig del av Core Graphics rammeverket. Du kan ofte se Quartz 2D kalt core grafikk eller bare CG.

Quartz 2D bruker "malerens modellen". I malerens modell, gjelder hver påfølgende tegning drift et lag med "male" til en utgang "lerret", ofte kalt en side. Tenk på dette som en kunstner jobber med et maleri. Hvis kunstneren var å male hele lerretet blå og deretter male noen skyer på lerretet da skyene ville dekke den blå under dem. Når noe er "malt" på lerretet, kan det ikke endres, men ved å legge mer maling på toppen av det.

Alle tegning i Quartz 2D er gjort gjennom en grafikk kontekst av type CGContextRef. Med en referanse til en grafikk sammenheng, kan du bruke Quartz 2D funksjoner for å trekke til konteksten, utføre operasjoner, som for eksempel oversette den sammenheng, og endre grafiske statlige parametere, slik som linjebredde og fyllfarge. Quartz 2D er et C-basert API, slik du vil påberope seg C-funksjoner som passerer i sammenheng som en parameter.

For å trekke til skjermen på iOS, du må underklasse en UIView og overstyre drawRect (_ :) metoden. Det er innenfor denne drawRect (_ :) metode som du vil gjøre noe tilpasset tegning. Du bør aldri
ringe drawRect (_ :) metoden direkte i koden. Hvis du trenger å oppdatere skjermen med ferske tegnekommandoer, bør du ringe metoder setNeedsDisplay () eller setNeedsDisplayInRect (_ :).

Når du bruker Quartz 2D på iOS, koordinater (0,0) er på øverst til venstre på skjermen. X koordinere øker når du flytter rett og y koordinere øker når du flytter ned.

Gjennom denne opplæringen, kan det være lurt å rådføre seg med Quartz 2D programmeringsveiledningen. Formålet med denne opplæringen er å komme i gang med Quartz 2D. Det er mye som ikke vil bli dekket, og for å få fullt utbytte alt som Quartz 2D har å tilby jeg foreslår at du leser programmeringsveiledningen.

Med denne korte introduksjonen ut av veien, la oss komme i gang med Quartz 2D.

1. Forbereder en UIView for tegning

Forutsatt at du har et prosjekt åpen og er klar til å begynne å jobbe med Quartz 2D, trinnene du må ta er ganske enkel. Du må lage en klasse som er en underklasse av UIView, legge en utsikt fra Object biblioteket til prosjektet i Interface Builder, og sette det synet klasse til UIView underklasse du opprettet. La oss gå gjennom dette trinnvis

Trinn 1: subclassing UIView

Gå til Fil >. New > Fil .... Under iOS-delen velger Source og velg Cocoa Touch klasse som mal da.

På skjermen som følger, gir klassen din et navn, sørg for at det er en UIView underklasse, og stille inn språket til Swift. Trykk Neste og velge hvor du vil lagre den nye klassen.

Hvis du viser kilden til den nyopprettede klassen, vil du se drawRect (_ :) metoden. Det er foreløpig kommentert ut, men vi vil endre det i en liten stund
import UIKitclass DrawLineView. UIView {/* //Bare styre drawRect: Hvis du utfører tilpasset tegning. //En tom implementering negativt påvirker ytelsen under animasjon. overstyring func drawRect (rect: CGRect) {//Tegning kode} * /}
Trinn 2: Legge til en visning og Stille Class

Åpne prosjektets storyboard og åpne objektbiblioteket til høyre. I søkefeltet nederst, skriv "UIView" til å filtrere ut gjenstander vi er ikke interessert i.

Dra en UIView eksempel på visningen kontrolleren. Med utsikt valgt, åpner Identity Inspektør på høyre og endre klasse til hva du heter underklassen.

Alle koden du legge inne i drawRect (_ :) metoden vil bli trukket når UIView underklassen er instansiert. Utsikten konfigurerer automatisk tegningen miljø, slik at du kan begynne å tegne umiddelbart. Utsikten konfigurerer CGContextRef nevnt i begynnelsen av denne leksjonen og det er inne i drawRect (_ :) metode som du vil få en referanse til det.

2. Starter Prosjekt

For å komme oss raskt i gang, jeg har gitt en startpakke prosjekt som har alle visninger allerede kablet opp og klar til bruk. De UIView undergrupper er oppkalt etter tegne kommandoen vi vil utforske. For eksempel når vi lærer om tegning linjer tilsvarende klasse vil bli navngitt DrawLinesView.

Du kan laste ned starter prosjektet fra GitHub. Vi vil komme i gang koding i neste trinn.

3. Innhenting av en referanse til Graphics Context

Før du kan gjøre noe tegning, må du få en henvisning til grafikk sammenheng. Dette gjøres på følgende måte.
La sammenheng = UIGraphicsGetCurrentContext ()

Dette returnerer en ugjennomsiktig type, CGContextRef, og du vil passere denne sammenheng inn i C-funksjoner for å gjøre den tilpassede tegning. Nå som vi vet hvordan å få en henvisning til grafikk sammenheng kan vi begynne å utforske tegnekommandoer.

4. Tegne en linje

Hvis du har lastet ned starter prosjektet, åpen DrawLineView.swift og legge til følgende til drawRect (_ :) metode
styre func drawRect (rect. CGRect) {la sammenheng = UIGraphicsGetCurrentContext () CGContextSetStrokeColorWithColor (kontekst, UIColor.redColor (). CGColor) CGContextMoveToPoint (kontekst, 0, 0) CGContextAddLineToPoint (kontekst, 200, 200) CGContextStrokePath (kontekst)}

Vi først få en henvisning til tegningen sammenheng diskutere Tidligere. Fordi dette er noe vi vil gjøre for hvert eksempel, vil jeg ikke nevne dette i de kommende eksemplene

CGContextSetStrokeColorWithColor (_. _ :) Funksjonen setter farge som linjen vil bli trukket eller strøk. Parametrene vi passerer i er grafikk kontekst og nye hjerneslag farge

Hvis du tenker på grafikk sammenheng lerretet av en maler, deretter CGContextMoveToPoint (_. _: _ :) Funksjon flytter pensel til et bestemt punkt på lerretet for å begynne eller fortsette å tegne. Tenk deg å tegne på et stykke papir, løfte hånden din, og flytte til en annen del av papiret og fortsetter å trekke. Hovedsak det er det denne metoden oppnår. Vi passerer i grafikk sammenheng og en x og y koordinat å starte tegningen fra

CGContextAddLineToPoint (_. _: _ :) Funksjonen tar som parameter grafikk sammenheng, x-verdien for enden av linjesegmentet, og y-verdien for slutten av linjesegmentet. Etter å legge linjesegmentet, vil den aktuelle punktet settes til endepunktet av linjesegmentet. Vi startet tegningen drift (0,0), etter denne tegningen operasjonen markøren eller pensel er på (200200).

Til slutt, for å gjøre selve tegningen du må ringe CGContextStrokePath (_ :) funksjon bestått i grafikk context.This funksjon trekker bare en linje langs den veien vi angitt.

Bygg og kjøre prøveprosjektet for å se effekten.

5. Tegne et rektangel

Åpne DrawRectangleView.swift og legge til følgende til drawRect (_ :) metoden. Du bør være kjent med de to første linjene nå
styre func drawRect (rect: CGRect). {La sammenheng = UIGraphicsGetCurrentContext () CGContextSetStrokeColorWithColor (. Sammenheng UIColor.redColor () CGColor) la rektangel = CGRectMake (50,50 , frame.size.width-100, frame.size.height-100) CGContextAddRect (kontekst, rektangel) CGContextStrokePath (kontekst)}

CGRectMake (_: _: _: _ :) funksjon er en del av CGGeometry og gir en enkel måte å lage en CGRect struktur. Som navnet tilsier, er CGRect en struktur som inneholder plasseringen og dimensjonene av et rektangel. En CGRect har to felt, opprinnelse og størrelse, som er en CGPoint og en CGSize hhv. Hvis du ikke er kjent med disse datatypene, da har en rask lese i CGGeometry referansen

Vi skaper en konstant, rektangel, ved hjelp av CGRectMake (_. _: _: _ :) Funksjon og ringe CGContextAddRect (_: _ :) funksjon, som tar som parametre grafikk sammenheng og en CGRect. Til slutt, vi kaller CGContextStrokePath (kontekst) for å tegne rektangelet.

Bygg og kjøre prosjektet for å se rektangelet trukket til skjermen.

6. Tegne en sirkel

Åpne DrawCircleView.swift og oppdatere drawRect (_ :) metode som følger
styre func drawRect (rect. CGRect) {la sammenheng = UIGraphicsGetCurrentContext () CGContextSetStrokeColorWithColor (kontekst, UIColor.redColor () .CGColor) la rektangel = CGRectMake (50,50, frame.size.width-100, frame.size.height-100) CGContextAddEllipseInRect (kontekst, rektangel) CGContextStrokePath (kontekst)}

Du lurer kanskje på hvorfor vi ringer CGRectMake (_: _: _: _ :) når vi tegner en sirkel? Rektangelet er området sirkelen må passe innenfor. I koden ovenfor, skaper vi en sirkel ved hjelp av en firkant. Hvis du ønsker å tegne en oval eller ellipse, så må du gjøre rektangelet mer rektangulær form

Vi kaller CGContextAddEllipseInRect (_. _ :) Funksjon, som tar som parametre grafikk kontekst og rektangel inn for å kunne trekke den ellipse. Sirkelen er tegnet ved å ringe CGContextStrokePath (_ :), passerer i grafikk sammenheng.

7. Tegne en Arc

Åpne DrawArcView.swift og legge til følgende kode inne i drawRect (_ :) metode
styre func drawRect (rect. CGRect) {la sammenheng = UIGraphicsGetCurrentContext () CGContextSetStrokeColorWithColor (kontekst, UIColor .redColor () CGColor) CGContextAddArc (kontekst, 100,100,50,3.14,0,1) CGContextStrokePath (kontekst)}

CGContextAddArc (_. _: _: _: _: _: _ :) funksjonen tar ganske mange parametre:

grafikk sammenheng

x-verdien for sentrum av buen

y-verdien for sentrum av buen

buen radius

vinkelen til startpunktet på buen, målt i radianer fra den positive x-aksen

vinkelen til endepunktet på buen, målt i radianer fra den positive x-aksen

til en verdi av en skape en klokken bue eller en verdi på 0 for å lage en mot lysbue

8. Tegne en bane

For å trekke mer komplekse former, skaper du en sti og klappe den. Ta en titt på drawRect (_ :) metode i DrawPathView.swift
styre func drawRect (rect. CGRect) {la sammenheng = UIGraphicsGetCurrentContext () CGContextSetStrokeColorWithColor (kontekst, UIColor.redColor () CGColor) CGContextMoveToPoint (sammenheng. 25, 150) CGContextAddLineToPoint (kontekst, 175, 150) CGContextAddLineToPoint (kontekst, 100, 50) CGContextAddLineToPoint (kontekst, 25, 150) CGContextStrokePath (kontekst)}

I drawRect (_ :) metoden, kaller vi CGContextAddLineToPoint (_ : _: _ :) en rekke ganger for å lage en trekant. Merk at trekanten ikke er fylt, bare strøk. I neste trinn, vil vi se hvordan du skal fylle trekanten med farge.

9. Fylle en bane

Åpne FillPathView.swift og oppdatere drawRect (_ :) metode som vist nedenfor
styre func drawRect (rect. CGRect) {la sammenheng = UIGraphicsGetCurrentContext () CGContextMoveToPoint (kontekst, 25, 150) CGContextAddLineToPoint (kontekst, 175, 150) CGContextAddLineToPoint (kontekst, 100, 50) CGContextAddLineToPoint (kontekst, 25, 150) CGContextSetFillColorWithColor (kontekst, UIColor.redColor (). CGColor) CGContextFillPath (kontekst)}

I forrige trinn , strøk vi en bane, men du kan også fylle en bane med en bestemt farge. I ovennevnte drawRect (_ :) metode, starter vi med å lage en bane for den samme trekanten som i forrige eksempel. Denne gangen har vi satt en fyllfarge med CGContextSetFillColorWithColor (_: _ :) funksjon og kaller CGContextFillPath (_ :) snarere enn CGContextStrokePath (_ :)

10.. Fylle en ellipse

Bortsett fra å fylle stier, kan du også fylle ellipser og rektangler. I dette eksempel vil vi fylle en ellipse. Fylling et rektangel, men er svært like. Dokumentasjon vil fortelle deg hvordan det er gjort. Oppdatere drawRect (_ :) metode i FillEllipseView.swift som vist nedenfor
styre func drawRect (rect. CGRect) {la sammenheng = UIGraphicsGetCurrentContext () CGContextSetLineWidth (kontekst, 8,0) CGContextSetStrokeColorWithColor (kontekst, UIColor.redColor (). CGColor) la rektangel = CGRectMake (50,50, frame.size.width-100, frame.size.height-100) CGContextAddEllipseInRect (kontekst, rektangel) CGContextStrokePath (kontekst) CGContextSetFillColorWithColor (kontekst, UIColor.greenColor (). CGColor) CGContextFillEllipseInRect (kontekst, rektangel)}

De fleste av denne koden skal være kjent nå. Vi bruker en ny funksjon, CGContextSetLineWidth (_: _ :), for å sette linje bredde og vi kaller CGContextFillEllipseInRect (_: _ :) å fylle ellipse. Denne funksjonen tar som parameter grafikk sammenheng og rektangelet som å fylle ellipse.

11. Legge Lines

CGContextAddLines (_: _: _ :) funksjonen er en hendig funksjon når du har et antall tilkoblede rette linjesegmenter du ønsker å tegne. Her gjenskape vi trekanten fra tidligere i eksemplene, ved hjelp av CGContextAddLines (_: _: _ :) funksjon. Legg til følgende kode i AddLinesView.swift
styre func drawRect (rect: CGRect). {La sammenheng = UIGraphicsGetCurrentContext () CGContextSetStrokeColorWithColor (kontekst, UIColor.redColor () CGColor.) La linjer = [CGPointMake (25150), CGPointMake ( 175150), CGPointMake (100,50), CGPointMake (25150)] CGContextAddLines (kontekst, linjer, 4) CGContextStrokePath (kontekst)}

De CGContextAddLines (_: _: _ :) funksjonen tar som parameter grafikk sammenheng, en matrise med verdier som angir start- og sluttpunktene på linjesegmenter å trekke så CGPoint strukturer, og antall elementer i tabellen. Legg merke til at det første punktet i matrisen angir utgangspunkt.

12. Tegne en Gradient

Med Quartz 2D, er det lett å trekke gradienter. Både lineære og radiale gradienter støttes. I dette eksempel vil vi trekke en lineær gradient. Dokumentasjonen vil hjelpe deg hvis du er interessert i tegning radial stigninger. Legg til følgende DrawGradientView.swift
styre func drawRect (rect: CGRect). {La sammenheng = UIGraphicsGetCurrentContext () la fargerom = CGColorSpaceCreateDeviceRGB () la farger = [UIColor.redColor () CGColor, UIColor.blueColor ().. CGColor] la steder: [CGFloat] = [0,0, 0,5] la gradient = CGGradientCreateWithColors (fargerom, farger, steder) la startpunkt = CGPointMake (0,0) la Endpoint = CGPointMake (200200) CGContextDrawLinearGradient (kontekst, gradient, startpunkt, endepunkt , 0)}

CGContextDrawLinearGradient (_: _: _: _: _ :) funksjonen tar som parametere:

grafikk sammenheng

a CGGradient struktur

et startpunkt

et sluttpunkt

opsjons flagg som angir om fyllingen blir utvidet utover start- eller sluttpunkt

En CGGradient struktur definerer en smidig overgang mellom farger over et område. Den har et fargerom, to eller flere farger, og en plassering for hver farge. Konstantene fargerom, farger og steder i eksempelet ovenfor representerer disse delene som utgjør CGGradient

For å trekke gradient, kaller vi det CGContextDrawLinearGradient (_. _: _: _: _ :) Funksjon, passerer i grafikk sammenheng CGGradient, start- og sluttverdiene, og 0 for å indikere at fyllingen bør strekke seg utover startsted.

13. Tegne en Shadow, En skygge er et bilde tegnet under, og forskjøvet fra, en grafikk objekt slik at skyggen etterligner effekten av en lyskilde legg opp grafikken objekt. - Quartz 2D Programming Guide

Det er to funksjoner du kan bruke til å tegne skygger, CGContextSetShadow (_: _: _ :) og CGContextSetShadowWithColor (_: _: _: _ :). Ved bruk CGContextSetShadow (_: _: _ :), alle objekter trekkes blir skygget bruker en svart farge med 1/3 alpha. Den CGContextSetShadowWithColor (_: _: _: _: funksjonen lar deg angi en farge for skygge

La oss se hvordan dette fungerer i praksis Legg til følgende SetShadowWithColor.swift
styre func drawRect... (rect: CGRect) {la sammenheng = UIGraphicsGetCurrentContext () CGContextSaveGState (kontekst) la shadowOffset = CGSizeMake (-15,20) CGContextSetShadowWithColor (sammenheng shadowOffset, 3, UIColor.greenColor () CGColor.) CGContextSetStrokeColorWithColor (kontekst, UIColor.redColor ( ) .CGColor) la rektangel = CGRectMake (50,50, frame.size.width-100, frame.size.height-100) CGContextAddRect (kontekst, rektangel) CGContextStrokePath (kontekst) CGContextRestoreGState (kontekst)}

Når tegning skygger bør du spare staten for grafikk sammenheng, gjøre eventuelle nødvendige endringer, og deretter gjenopprette grafikk staten. kaller vi CGContextSaveGState (_ :) å lagre nåværende tilstand av grafikk sammenheng, angi en forskyvning for skygge, shadowOffset, og ring CGContextSetShadowWithColor (_: _: _: _ :) funksjon. Dette fungerer tar som parametere:

grafikk sammenheng

forskyvningen for skyggen

blur beløpet

fargen på skyggen < .no>

Resten av koden skal være kjent for deg. Til slutt, gjenoppretter vi grafikk sammenheng ved å ringe CGContextRestoreGState (_ :), passerer i grafikk sammenheng.

14. Tegne en Happy Face

Jeg trodde det ville være morsomt å avslutte denne opplæringen ved å tegne en enkel lykkelig ansikt å bruke det vi har lært gjennom denne opplæringen. Legg til følgende DrawHappyFaceView.swift
styre func drawRect (rect: CGRect). {La sammenheng = UIGraphicsGetCurrentContext () la face = CGRectMake (50,50, frame.size.width-100, frame.size.height-100 ) CGContextAddEllipseInRect (kontekst, ansikt) CGContextSetFillColorWithColor (kontekst, UIColor.yellowColor (). CGColor) CGContextFillEllipseInRect (kontekst, ansikt) la leftEye = CGRectMake (75,75,10,10) CGContextSetFillColorWithColor (kontekst, UIColor.blackColor (). CGColor) CGContextFillEllipseInRect (kontekst, leftEye) la rightEye = CGRectMake (115,75,10,10) CGContextFillEllipseInRect (kontekst, rightEye) CGContextSetLineWidth (kontekst, 3,0) CGContextAddArc (kontekst, 100,100,30,3.14,0,1) CGContextStrokePath (kontekst)}

Gjennomføringen av drawRect (_ :) metoden bør være fornuftig nå, og du bør ha et lykkelig ansikt trukket til skjermen.

Konklusjon

Dette bringer denne opplæringen til en slutt . Du skal nå ha en grunnleggende forståelse av hvordan du utfører tilpasset tegning ved hjelp av Quartz 2D tegning motor. Jeg håper du har lært noe nyttig ved å lese denne opplæringen.