I denne opplæringen ser vi på noen av de avanserte funksjonene og bruksmønstrene til de ydmyke UIImage
klasse i iOS. Ved slutten av denne opplæringen har du lært følgende: Hvordan lage bilder i kode, hvordan du oppretter resizable bilder for UI-elementer som callouts, og hvordan du lager animerte bilder.
Hvis du noen gang har hatt å vise et bilde i din iOS-app, er du sikkert kjent med UIImage
. Det er klassen som lar deg representere bilder på iOS. Dette er langt den vanligste måten å bruke UIImage
og er ganske grei: du har en bildefil i et av flere standardbildedeformater (PNG, JPEG, BMP, etc.) og du vil vise det i appens grensesnitt. Du instanser en ny UIImage
eksempel ved å sende klassemeldingen imageNamed:
. Hvis du har en forekomst av UIImageView
, du kan sette det bilde
eiendom til UIImage
eksempel, og deretter kan du holde i bildevisningen til grensesnittet ditt ved å sette det som et undervisning til skjermvisningen din:
UIImage * img = [UIImage imageNamed: filnavn]; UIImageView * imgView = [[UIImageView alloc] initWithImage: img]; // Sett ramme, etc ... [self.view addSubview: imgView];
Du kan også utføre tilsvarende av prosedyren ovenfor direkte i Interface Builder.
Det finnes noen andre måter å instantiere et bilde på, for eksempel fra en URL, eller fra et arkivert bilde som ble lagret som en NSData
type, men vi vil ikke fokusere på disse aspektene i denne opplæringen.
Før vi snakker om å lage bilder i kode, husk at vi på det mest primitive nivå vet hva et 2D-bilde egentlig er: et todimensjonalt utvalg av pixelverdier. Meldingsområdet som representerer pikselrangeringen for et bilde blir ofte referert til som dets bitmap butikk. Dette er noen ganger nyttig å huske når du lager minnehensyn. Det er imidlertid viktig å innse at a UIImage
er virkelig en høyere grad av abstraksjon av et bilde enn det for en pikselgruppe, og en som er optimalisert i henhold til krav og bruksscenarier for en mobil plattform. Selv om det er teoretisk mulig å lage et bilde ved å fylle en hel pixelmatrise med verdier, eller å nå inn i et eksisterende bildes bitmap og lese eller endre verdien av en individuell pixel, er det ganske ubeleilig å gjøre det på iOS og er egentlig ikke forenklet av API. Men siden de fleste app-utviklere sjelden finner ekte behov for å rotere med bilder på pikselnivå, er det vanligvis ikke et problem.
Hva UIImage
(eller mer generelt, UIKit og Core Graphics) gjør det enklere for utvikleren å gjøre er å lage et nytt bilde ved å komponere eksisterende bilder på interessante måter, eller å generere et bilde ved å rasterisere en vektor tegning konstruert ved hjelp av UIKit's UIBezierPath
klasse eller Core grafikk CGPath ...
funksjoner. Hvis du vil skrive en app som lar brukeren lage en collage av bildene sine, er det lett å gjøre med UIKit og UIImage
. Hvis du har utviklet, sier en frihånds tegnefil, og du vil la brukeren redde skapelsen, vil den enkleste tilnærmingen innebære å trekke ut en UIImage
fra tegningens kontekst. I den første delen av denne opplæringen lærer du nøyaktig hvordan begge disse ideene kan oppnås!
Det er viktig å huske på at a UIImage
konstruert på denne måten er ikke annerledes enn et bilde som er oppnådd ved å åpne et bilde fra fotoalbumet, eller laste ned fra Internett: det kan lagres i arkivet eller lastes opp til fotoalbumet eller vises i et UIImageView
.
Bildestørrelse er en viktig type bilde manipulasjon. Åpenbart vil du unngå å forstørre et bilde, fordi det fører til at bildens kvalitet og skarphet blir rammet. Det er imidlertid visse scenarier der det er behov for resizable bilder, og det er faktisk fornuftige måter å gjøre det, som ikke forringer kvaliteten på bildet. UIImage
henvender seg til denne situasjonen ved å tillate bilder som har et indre resizable område og "kantinnsatser" på bildegrensene som endres i en bestemt retning, eller endrer ikke størrelsen i det hele tatt. Videre kan resizing-størrelsen utføres enten ved flislegging eller strekking av de omsettelige delene for to noe forskjellige effekter som kan være nyttige i forskjellige situasjoner.
Den andre delen av implementeringen vil vise en konkret implementering av denne ideen. Vi skriver en fin liten klasse som kan vise hvilken som helst mengde tekst i et resizable bilde!
Til slutt snakker vi litt om animerende bilder med UIImage
. Som du sikkert kan gjette, betyr dette "å spille" en rekke bilder i rekkefølge, noe som gir upphov til illusjonen av animasjon, akkurat som de animerte GIF-ene du ser på Internett. Selv om dette kan virke litt begrenset, i enkle situasjoner UIImage
Den animerte bildestøtten kan være akkurat det du trenger, og alt som trengs, er et par linjer med kode for å komme opp og løpe. Det er det vi skal se på i tredje og siste delen av denne opplæringen! Tid til å rulle opp ermene og komme på jobb!
Opprett et nytt iOS-prosjekt i Xcode, med "Tom søknad"mal. Ring den "UIImageFun". Kontroller alternativet for Automatisk referansetelling, men fjern merket for valgene for Core Data og Unit Tests.
Opprette et nytt Xcode-prosjektEt lite notat, før vi fortsetter: denne opplæringen bruker flere sett med bilder, og for å få disse må du klikke hvor det står "Last ned kildefiler" øverst på denne siden. Etter at du har lastet ned og pakket ut arkivet, drar du mappen med navnet "Bilder" i Prosjektnavigatoren - fanen til venstre i venstre hjørne i Xcode. Hvis venstre rute ikke er synlig, trykk deretter på tastekombinasjonen ⌘ + 0 for å gjøre det synlig og sørg for at fanen til venstre - hvis ikonet ser ut som en mappe - er valgt.
Dra og slipp mappen Bilder til prosjektet ditt Pass på at "Kopier elementer til målgruppens mappe (om nødvendig)"alternativet i dialogboksen er merket". Kontroller at filene kopieres til prosjektmappen dinDen nedlastede filen inneholder også det komplette Xcode-prosjektet med bildene som allerede er lagt til i prosjektet, hvis du sitter fast et sted.
Opprett en ny fil for en Objective-C-klasse, ring den ViewController
og gjør det til en underklasse av UIViewController
. Kontroller at alternativene knyttet til iPad og XIB ikke er merket av.
Erstatt all koden i ViewController.m med følgende:
#import "ViewController.h" @interface ViewController () UIImage * img; UIImageView * iv; NSMutableArray * ivs; @end @implementation ViewController - (void) viewDidLoad [super viewDidLoad]; // (1) Opprette en bitmap kontekst, fylle den med gul som "bakgrunn" farge: CGSize size = CGSizeMake (self.view.bounds.size.width, self.view.bounds.size.height); UIGraphicsBeginImageContextWithOptions (CGSizeMake (size.width, size.height), YES, 0.0); [[UIColor yellowColor] setFill]; UIRectFill (CGRectMake (0, 0, size.width, size.height)); // (2) Lag en sirkel via en bezier-sti og strekk + fylle den i bitmap-konteksten: UIBezierPath * bezierPath = [UIBezierPath bezierPathWithArcCenter: CGPointMake (size.width / 2, size.height / 2) radius: 140 startAngle: 0 endAngle: 2 * M_PI med klokken: JA]; [[UIColor blackColor] setStroke]; bezierPath.lineWidth = 5.0; [bezierPath stroke]; [[UIColor redColor] setFill]; [bezierPath fill]; // (3) Opprette en rekke bilder: NSArray * rocks = @ [[UIImage imageNamed: @ "rock1"], [UIImage imageNamed: @ "rock2"], [UIImage imageNamed: @ "rock3"], [UIImage imageNamed : ["rock4"], [UIImage imageNamed: @ "rock5"], [UIImage imageNamed: @ "rock6"], [UIImage imageNamed: @ "rock7"], [UIImage imageNamed: @ "rock8"], [UIImage imageNamed : @ "rock9"]]; // (4) Tegne steiner i en løkke, hver valgt tilfeldig fra bildesettet og tegnet i tilfeldig posisjon i et sirkulært mønster: for (int i = 0; i < 100; i++) int idx = arc4random() % rocks.count; NSLog(@"idx = %d", idx); int radius = 100; int revolution = 360; float r = (float)(arc4random() % radius); float angle = (float)(arc4random() % revolution); float x = size.width/2 + r * cosf(angle * M_PI/180.0); float y = size.height/2 + r * sinf(angle * M_PI/180.0); CGSize rockSize = ((UIImage *)rocks[idx]).size; [rocks[idx] drawAtPoint:CGPointMake(x-rockSize.width/2, y-rockSize.height/2)]; // (5) Deriving a new UIImage instance from the bitmap context: UIImage *fImg = UIGraphicsGetImageFromCurrentImageContext(); // (6) Closing the context: UIGraphicsEndImageContext(); // (7) Setting the image view's image property to the created image, and displaying iv = [[UIImageView alloc] initWithImage:fImg]; [self.view addSubview:iv]; @end
Konfigurer App Delegate til å bruke en forekomst av ViewController
som root view kontrolleren ved å erstatte koden i AppDelegate.m med følgende:
#import "AppDelegate.h" #import "ViewController.h" @implementation AppDelegate - (BOOL) søknad: (UIApplication *) søknad didFinishLaunchingWithOptions: (NSDictionary *) launchOptions self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] grenser]]; self.window.rootViewController = [[ViewController alloc] init]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; returnere JA; @slutt
La oss undersøke koden for viewDidLoad:
hvor alle handlingen skjer. Vi refererer til tallene i kodesammenheng.
UIGraphicsBeginImageContextWithOptions ()
funksjon. Denne funksjonen tar som argumenter a CGSize
, som vi har satt til størrelsen på visningskontrollens visning, som betyr hele skjermen. De BOOL
Fortell oss om konteksten er ugjennomsiktig eller ikke. En ugjennomsiktig sammenheng er mer effektiv, men du kan ikke "se gjennom" den. Siden det ikke er noe av interesse under vår sammenheng, setter vi det på JA
. Skalfaktoren, som er en flyte
som vi satte til 0,0 (en verdi som sikrer enhetsspesifikk skala). Avhengig av om enheten har en retina-skjerm, skal skalfaktoren settes til henholdsvis 2,0 eller 1,0. Jeg skal snakke litt mer om skalafaktoren i løpet av kort tid, men for en omfattende diskusjon, vil jeg referere deg til den offisielle dokumentasjonen (spesielt "Punkter vs. Piksler" i Tegning og utskrift Guide for iOS). Når vi oppretter en bildekontekst på denne måten, blir den den gjeldende kontekst. Dette er viktig fordi du skal tegne med UIKit, Vi må ha en nåværende tegningskontekst der all implisitt tegning skjer. Vi stiller nå en fyllfarge for gjeldende kontekst og fyller i et rektangel størrelsen på hele konteksten.
Vi lager nå en UIBezierPath
eksempel i form av en sirkel, som vi slår med en tykk oversikt og fyller med en annen farge. Dette avsluttes tegningsdelen av bildesettingen vår.
imageNamed:
initialiserer av UIImage
. Det er viktig å observere her at vi har to sett med rockbilder: rock1.png, rock2.png, ... og [email protected], [email protected], sistnevnte er to ganger oppløsningen til den førstnevnte. En av de flotte funksjonene i UIImage
er det ved kjøretid på imageNamed:
Metoden søker automatisk etter et bilde med suffiks @ 2x antatt å være av dobbel oppløsning på en Retina-enhet. Hvis en er tilgjengelig, blir den brukt! Hvis det etterfylte bildet er fraværende eller hvis enheten ikke er retina, enn standardbildet blir brukt. Vær oppmerksom på at vi ikke angir suffiks av bildet i initialisatoren. Bruken av bilder med enkelt- og dobbeltoppløsning i forbindelse med den enhetavhengige skalaen (som følge av innstillingen skala
til 0.0
) sikrer at den faktiske størrelsen på objektene på skjermen vil være den samme. Naturligvis blir Retina-bildene mer skarpe på grunn av den høyere pixeldensiteten. UIImage
metode drawAtPoint:
trekker det valgte steinbildet på det angitte punktet i den aktuelle bildekonteksten.UIImage
objekt fra innholdet i den aktuelle bildekonteksten, ved å ringe UIGraphicsGetImageFromCurrentImageContext ()
. UIGraphicsEndImageContext ()
slutter gjeldende bilde kontekst og rydder opp minne.bilde
eiendom av vår UIImageView
og vis den på skjermen.Bygg og løp. Utgangen skal se ut som følgende, bare randomisert annerledes:
Ullmage laget av tegning og sammensetningVed testing på både retina og ikke-retina enheter eller ved å endre enhetstypen i simulatoren under maskinvare meny, kan du sørge for at steinene er vendt med en i forhold til den andre. Igjen gjorde jeg bare dette slik at vi enkelt kunne bekrefte at det riktige settet av bilder ville bli plukket på kjøretid. Normalt er det ingen grunn for deg å gjøre dette!
For å samle - med risiko for å forklare punktet - opprettet vi et nytt bilde (a UIImage
objekt) ved å kombinere bilder vi allerede har på toppen av en tegning vi tegnet.
På neste del av implementeringen!
Vurder figuren nedenfor.
En callout (til venstre), dekonstruert for å vise hvordan bildet kan endres fornuftig (høyre)Det venstre bildet viser en utringing eller "snakkeboble"ligner på den som er sett i mange meldingsapps. Vi vil åpenbart ønske at utkallingen skal utvides eller krympes i henhold til mengden av tekst i den. Også, vi vil gjerne bruke et enkelt bilde som vi kan generere utrop fra Hvis vi forstørrer hele utropet like i alle retninger, blir hele bildet pikslet eller uklart, avhengig av størrelsesalgoritmen som brukes. Merk imidlertid måten som utropsbildet er utformet. Det kan utvides i visse retninger uten tap av kvalitet bare ved å kopiere (flislegging) piksler når vi går. Hjørneformene kan ikke resizes uten å endre bildekvaliteten, men på den andre siden er midten bare en blokk med piksler med ensartet farge som kan gjøres til enhver størrelse vi liker. Topp- og bunnsidene kan strekkes horisontalt uten å miste kvalitet, og venstre og høyre side vertikalt. Alt dette er vist på bildet på høyre side.
Heldigvis for oss, UIImage
har et par metoder for å lage resizable bilder av denne typen. Den vi skal bruke er resizableImageWithCapInsets:
. Her er "cap-innspill"representerer dimensjonene av de ikke-strekkbare hjørner av bildet (starter fra toppmargen og beveger mot urviseren) og er innkapslet i en struct
av type UIEdgeInsets
bestående av fire flyte
s:
typedef struct float topp, venstre, bunn, høyre; UIEdgeInsets;
Figuren under skal forklare hva disse tallene representerer:
La oss utnytte resizable UIImage
s for å lage en enkel klasse som lar oss legge til hvilken som helst mengde tekst i et resizable bilde!
Lage en NSObject
underklasse kalles Merk
og skriv inn følgende kode i Note.h og Note.m henholdsvis.
#importere@interface Merk: NSObject @property (nonatomic, readonly) NSString * tekst; @property (nonatomic, readonly) UIImageView * noteView; - (id) initWithText: (NSString *) tekst fontSize: (float) fontSize noteChrome: (UIImage *) img edgeInsets: (UIEdgeInsets) insets maximumWidth: (CGFloat) bredde topLeftCorner: (CGPoint) hjørne; @slutt
#import "Note.h" @implementation Note - (id) initWithText: (NSString *) tekst fontSize: (float) fontSize noteChrome: (UIImage *) img edgeInsets: (UIEdgeInsets) innspill maximumWidth: (CGFloat) bredde topLeftCorner: (CGPoint ) hjørne if (self = [super init]) #define LARGE_NUMBER 10000 // bare et stort (men tilfeldig) tall fordi vi ikke vil legge noen vertikal begrensning på notatstørrelsen _text = [NSString stringWithString: text] ; CGSize computedSize = [text sizeWithFont: [UIFont systemFontOfSize: fontSize] constrainedToSize: CGSizeMake (bredde, LARGE_NUMBER) lineBreakMode: NSLineBreakByWordWrapping]; UILabel * textLabel = [[UILabel alloc] init]; textLabel.font = [UIFont systemFontOfSize: fontSize]; textLabel.text = self.text; textLabel.numberOfLines = 0; // ubegrenset antall linjer textLabel.lineBreakMode = NSLineBreakByWordWrapping; textLabel.frame = CGRectMake (insets.left, insets.top, computedSize.width, computedSize.height); _noteView = [[UIImageView alloc] initWithFrame: CGRectMake (corner.x, corner.y, textLabel.bounds.size.width + insets.left + insets.right, textLabel.bounds.size.height + insets.top + insets.bottom )]; _noteView.image = [img resizableImageWithCapInsets: innspill]; [_noteView addSubview: textLabel]; returner selv; @slutt
Initieringsmetoden for Merk
, -initWithText: fontSize: noteChrome: edgeInsets: maximumWidth: topLeftCorner:
tar flere parametere, inkludert tekststrengen som skal vises, skriftstørrelsen, notatet "krom" (som er resizable UIImage
som omgir teksten), dens cap-innspill, maksimal bredde notatets bildevisning kan ha, og øverste venstre hjørne av notatrammen.
En gang initialisert, den Merk
klasse' noteView
eiendom (av type UIImageView
) er brukergrensesnittelementet som vi vil vise på skjermen.
Gjennomføringen er ganske enkel. Vi utnytter en veldig nyttig metode fra NSString
s kategori på UIKit, sizeWithFont: constrainedToSize: lineBreakMode:
, som beregner størrelsen som en blokk med tekst vil oppta på skjermen, gitt visse parametere. Når vi har gjort det, konstruerer vi en tekstetikett (UILabel
) og fylle den med den angitte teksten. Ved å ta hensyn til innstørrelsesstørrelsene og den beregnede tekststørrelsen tilordner vi etiketten en passende ramme, samt å gjøre vår noteView
's bilde
stor nok (ved hjelp av resizableImageWithCapInsets
metode) slik at etiketten passer komfortabelt på toppen av det indre området av bildet.
I figuren nedenfor representerer bildet til venstre det som et typisk notat som inneholder noen få linjer verdt tekst i det ville se ut.
Bruke det minste mulige bildet for å bygge et resizable bildeLegg merke til at interiøret ikke har noe av interesse. Vi kan faktisk "pare" bildet til sitt minste minimum (som vist til høyre) ved å kvitte seg med alle piksler i interiøret med bilderedigeringsprogramvare. Faktisk, i dokumentasjonen Apple anbefaler at for best ytelse, bør det indre området være flislagt 1 x 1 piksler. Det er det morsomme lille bildet til høyre representerer, og det er det vi skal passere til vår Merk
initializer. Pass på at det ble lagt til prosjektet ditt som squeezednote.png da du drog Bilder mappe til prosjektet ditt.
I ViewController.m
, Tast inn #import "Note.h"
uttalelse på toppen. Kommentere det forrige viewDidLoad:
skjema og skriv inn følgende:
- (void) viewDidLoad [super viewDidLoad]; NSString * text1 = @ "Hei!"; NSString * text2 = @ "Jeg størrelse meg selv etter innholdet mitt!"; NSString * text3 = @ "Standard kjedelig tilfeldig tekst: Kjennetegnes ved at du er en, og du er sikker på at du ikke er i stand til å jobbe med et dolor magna-aliqua. Utmerket for små og mellomstore utøvere, og du trenger ikke å utnytte dette. Følgelig. Duis aute irure dolor i reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Unntatt sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id s laborum. "; Ullmage * noteChrome = [UIImage imageNamed: @ "squeezednote"]; UIEdgeInsets edgeInsets = UIEdgeInsetsMake (37, 12, 12, 12); Note * note1 = [[Note alloc] initWithText: text1 fontSize: 25.0 noteChrome: noteChrome edgeInsets: edgeInsets maximumWidth: 300 topLeftCorner: CGPointMake (10, 10)]; Note * note2 = [[Note alloc] initWithText: text2 fontSize: 30.0 noteChrome: noteChrome edgeInsets: edgeInsets maximumWidth: 300 topLeftCorner: CGPointMake (200, 10)]; Note * note3 = [[Note alloc] initWithText: text3 fontSize: 16.0 noteChrome: noteChrome edgeInsets: edgeInsets maximumWidth: 300 topLeftCorner: CGPointMake (10, 200)]; [self.view addSubview: note1.noteView]; [self.view addSubview: note2.noteView]; [self.view addSubview: note3.noteView];
Vi skaper bare Merk
objekter med en annen mengde tekst. Bygg, løp og observer hvor fint "krom" rundt notatet endres for å imøtekomme teksten innenfor sine grenser.
For sammenligningens skyld, er det hva utgangen ville se ut om "squeezednote.png"ble konfigurert som en" normal " UIImage
instantiated med imageNamed:
og endret på samme måte i alle retninger.
Ganske vist ville vi ikke bruke et "minimalt" bilde som "squeezednote", med mindre vi brukte resizable bilder i utgangspunktet, så effekten som vises i det forrige skjermbildet, er sterkt overdrevet. Imidlertid vil det uskarpe problemet være der.
På den siste delen av opplæringen!
Ved animert bilde mener jeg egentlig en sekvens av individuelle 2D-bilder som vises i rekkefølge. Dette er egentlig bare sprite-animasjonen som brukes i de fleste 2D-spill. UIImage
har en initialiseringsmetode animatedImageNamed: varighet:
som du sender en streng som representerer prefikset av sekvensen av bilder som skal animeres, så hvis bildene dine heter "robot1.png", "robot2.png", ..., "robot60.png", Du vil bare passere i strengen "robot" til denne metoden. Varigheten av animasjonen er også sendt inn. Det er ganske mye det! Når bildet er lagt til en UIImageView
, det animerer kontinuerlig på skjermen. La oss implementere et eksempel.
Kommentere den forrige versjonen av viewDidLoad:
og skriv inn følgende versjon.
- (void) viewDidLoad [super viewDidLoad]; ivs = [NSMutableArray array]; img = [UIImage animatedImageNamed: @ "eksplosjon" varighet: 2.0]; UITapGestureRecognizer * trykk = [[UITapGestureRecognizer alloc] initWithTarget: selvhandling: @selector (eksplosjon :)]; [self.view addGestureRecognizer: trykk]; - (void) eksplosjon: (UITapGestureRecognizer *) t CGPoint loc = [t locationInView: self.view]; for (UIImageView * v i ivs) if ([v pointInside: [v convertPoint: loc fromView: self.view] withEvent: null]) [ivs removeObject: v]; [v removeFromSuperview]; komme tilbake; UIImageView * v = [[UIImageView alloc] initWithImage: img]; v.center = loc; [ivs addObject: v]; [self.view addSubview: v];
Vi har lagt til et sett med PNG-bilder til prosjektet vårt, explosion1.png gjennom explosion81.png som representerer en animert sekvens av en brennende eksplosjon. Vår kode er ganske enkel. Vi oppdager et trykk på skjermen, og enten plasserer en ny eksplosjonsanimasjon ved trykkpunktet, eller hvis det allerede var en eksplosjon på det tidspunktet, fjerner vi det. Merk at den grunnleggende koden består av bare å lage et animert bilde via animatedImageNamed:
som vi passerer strengen @"eksplosjon"
og en flyteverdi for varigheten.
Du må kjøre appen på simulatoren eller en enhet selv for å kunne nyte fyrverkeri, men her er et bilde som fanger en enkelt ramme av handlingen, med flere eksplosjoner på gang samtidig.
Animerte eksplosjonerGanske vist, hvis du utviklet et høyt aktivitetsspill som en skyte dem opp eller en sideskrollende plattform, så UIImage
s støtte til animerte bilder virker ganske primitive. De ville ikke være din gå til tilnærming for å implementere animasjon. Det er egentlig ikke hva UIImage
er bygget for, men i andre mindre krevende scenarier kan det være bare billetten! Siden animasjonen går kontinuerlig til du fjerner det animerte bildet eller bildevisningen fra grensesnittet, kan du gjøre animasjonene stanset etter et foreskrevet tidsintervall ved å sende en forsinket melding med - performSelector: withObject: afterDelay:
eller bruk en NSTimer
.
I denne opplæringen så vi på noen nyttige, men mindre kjente funksjoner i UIImage
klasse som kan komme til nytte. Jeg foreslår at du tar en titt på UIImage
Klasse referanse fordi noen av funksjonene vi diskuterte i denne opplæringen har flere alternativer. For eksempel kan bilder sammensettes ved hjelp av en av flere blandingsalternativer. Resizable bilder kan konfigureres i en av to resizing moduser, flislegging (som er den vi brukte implisitt) eller strekker seg. Selv animerte bilder kan ha innspill. Vi snakket ikke om det underliggende CGImage
ugjennomsiktig type det UIImage
brytes rundt. Du må håndtere CGImage
s hvis du programmerer på Core Graphics nivå, som er den C-baserte API som sitter ett nivå under UIKit i IOS-rammen. Core Graphics er kraftigere enn UIKit å programmere med, men ikke helt så enkelt. Vi snakket heller ikke om bilder laget med data fra a Kjernebilde objekt, som det ville gi mer mening i en Kjernebilde opplæringen.
Jeg håper du fant denne opplæringen nyttig. Hold kodingen!