iOS Fundamentals: Rammer, grenser, og CGGeometry

iOS Fundamentals: Rammer, grenser, og CGGeometry
52
Del
16
Del

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

Arbeide med CGPoint, CGSize, og CGRect strukturer er ikke vanskelig hvis du er vant til et språk som støtter prikken syntaks. Men programma posisjonering utsikt eller skrive tegning kode er ordrik og kan bli vanskelig å lese.

I denne opplæringen, vil jeg gjerne fjerne noen misoppfatninger om rammer og grenser, og introdusere deg til CGGeometry
, en samling av strukturer, konstanter, og funksjoner som gjør arbeidet med CGPoint, CGSize, og CGRect så mye enklere.

1. Datatyper

Hvis du er ny til iOS eller OS X utvikling, du lurer kanskje på hva CGPoint, CGSize, og CGRect strukturer er. Den CGGeometry Reference definerer en rekke geometriske primitiver eller strukturer og de vi er interessert i er CGPoint, CGSize, og CGRect.

Som de fleste av dere sikkert vet, er CGPoint en C struktur som definerer et punkt i en koordinatsystemet. Opprinnelsen til denne koordinatsystem er øverst til venstre på iOS og nederst til venstre på OS X. Med andre ord, orienteringen av sin vertikale aksen er forskjellig på iOS og OS X.

CGSize er en annen enkel C struktur som definerer en bredde og en høyde verdi, og CGRect har en opprinnelse feltet, en CGPoint, og en størrelse felt, en CGSize. Sammen opprinnelse og størrelse felt definere posisjonen og størrelsen av et rektangel.

CGGeometry Reference definerer også andre typer, som for eksempel CGFloat og CGVector. CGFloat er noe mer enn en typedef for float eller double, avhengig av arkitekturen programmet kjører på, 32-bit eller 64-bit.

2. Rammer og Bounds

Det første jeg ønsker å avklare er forskjellen mellom en visning ramme og dens grenser, fordi dette er noe som turer opp mye av begynnelsen iOS-utviklere. Forskjellen er ikke vanskelig skjønt.

På iOS og OS X, har en søknad flere koordinatsystemer. På iOS, for eksempel, er programmets vindu plassert i skjermen koordinatsystem og hver subview av vinduet er plassert i vinduets koordinatsystem. Med andre ord, er subviews av et syn alltid plassert i visningen koordinatsystem.

Frame

Som dokumentasjon klargjør, er rammen av en visning en struktur, en CGRect , som definerer størrelsen på visningen og sin posisjon i visningens Super, The Super koordinatsystem. Ta en titt på følgende diagram for avklaring.

Bounds

Den grenser eiendommen til en visning definerer størrelsen på visningen og sin posisjon i visningen eget koordinatsystem. Dette betyr at i de fleste tilfeller opprinnelsen til grensene for en visning er satt til {0,0} som vist i diagrammet nedenfor. Utsikten er grenser er viktig for å tegne utsikten.

Når rammen eiendommen av en visning er endret, er utsikten sentrum og /eller grenser også endret.

3. CGGeometry Referanse

Praktiske Getters

Som jeg nevnte tidligere, er CGGeometry Reference en samling av strukturer, konstanter, og funksjoner som gjør det lettere å jobbe med koordinater og rektangler. Du har kanskje kjørt inn kodebiter som ligner på dette:
CGPoint poeng = CGPointMake (self.view.frame.origin.x + self.view.frame.size.width, self.view.frame.origin.y + selv .view.frame.size.height);

Ikke bare er dette tekstutdraget vanskelig å lese, er det også ganske utførlig. Vi kan omskrive denne kodebiten med to praktiske funksjoner som er definert i CGGeometry Reference
CGRect ramme = self.view.frame;. CGPoint poeng = CGPointMake (CGRectGetMaxX (frame), CGRectGetMaxY (frame));

For å forenkle ovenfor kodebiten, lagrer vi utsikten ramme i en variabel kalt bilde og bruke CGRectGetMaxX og CGRectGetMaxY. Navnene på de funksjoner er selvforklarende.

CGGeometry Reference definerer funksjoner for å returnere de minste og største verdiene for x- og y-koordinatene til et rektangel samt x- og y-koordinater som ligge på rektangelet sentrum. To andre praktiske getter funksjoner er CGRectGetWidth og CGRectGetHeight.

Opprette Structures

Når det gjelder å skape CGPoint, CGSize, og CGRect strukturer, de fleste av oss bruker CGPointMake og sine fettere. Disse funksjoner er også definert i CGGeometry Reference. Selv om deres gjennomføring er overraskende lett, de er utrolig nyttig og at du skal skrive mindre kode. For eksempel, dette er hvordan CGRectMake faktisk gjennomføres:
CGRectMake (CGFloat x, CGFloat y, CGFloat bredde, CGFloat høyde) {CGRect rect; rect.origin.x = x; rect.origin.y = y; rect.size.width = bredde; rect.size.height = høyde; returnere rect;}
modifisere rektangler

Funksjonene vi har dekket så langt er ganske godt kjent blant iOS-utviklere og hjelpe oss skrive mindre kode som er mer lesbar. Imidlertid CGGeometry Reference definerer også flere andre funksjoner som er mindre kjent. For eksempel definerer CGGeometry Reference halvt dusin funksjoner for å endre CGRect strukturer. La oss ta en titt på noen av disse funksjonene.

CGRectUnion

CGRectUnion godtar to CGRect strukturer og returnerer den minste mulige rektangel som inneholder både rektangler. Dette kan høres trivielt, og jeg er sikker på at du enkelt kan utføre samme oppgave med noen få linjer med kode, men CGGeometry handler om å gi deg et par dusin funksjoner som gjør din kode renere og mer lesbar.

Hvis du legger inn følgende kode til en visning kontrolleren viewDidLoad metode, bør du få følgende resultat i iOS Simulator. Den grå rektangelet er resultatet av å bruke CGRectUnion
//CGRectUnionCGRect frame1 = CGRectMake (80,0, 100,0, 150,0, 240,0);. ​​CGRect Frame2 = CGRectMake (140,0, 240,0, 120,0, 120,0); CGRect frame3 = CGRectUnion (frame1, Frame2); UIView * view1 = [[UIView alloc] initWithFrame: frame1] [view1 setBackgroundColor: [UIColor redColor]]; UIView * view2 = [[UIView alloc] initWithFrame: Frame2] [view2 setBackgroundColor: [UIColor orangeColor]]; UIView * view3 = [[UIView alloc] initWithFrame: frame3] [view3 setBackgroundColor: [UIColor grayColor]] [self.view addSubview: view3] [self.view addSubview: view2] [self.view addSubview: view1 ];

CGRectDivide

En annen nyttig funksjon er CGRectDivide, som lar deg dele et gitt rektangel i to rektangler. Ta en titt på følgende kodebiten og skjermbilde for å se hvordan det brukes
//CGRectDivideCGRect ramme = CGRectMake (10,0, 50,0, 300,0, 300,0);. ​​CGRect part1; CGRect part2; CGRectDivide (ramme, & part1, & part2, 100,0, CGRectMaxYEdge); UIView * view1 = [[UIView alloc] initWithFrame: frame] [view1 setBackgroundColor: [UIColor grayColor]]; UIView * view2 = [[UIView alloc] initWithFrame: part1] [view2 setBackgroundColor: [UIColor orangeColor]]; UIView * view3 = [[UIView alloc] initWithFrame: part2] [view3 setBackgroundColor: [UIColor redColor]] [self.view addSubview: view1] [self.view addSubview: view2] [selv .Utsikten addSubview: view3];

Hvis du skulle beregne rødt og oransje rektangel uten å bruke CGRectDivide, vil du ende opp med et par dusin linjer med kode. Gir den en prøve hvis du ikke tror meg.

Sammenligning og Containment

Sammenligning geometrisk struktur og kontroll for medlemskap er veldig enkelt med følgende seks functions:


CGPointEqualToPoint

CGSizeEqualToSize

CGRectEqualToRect

CGRectIntersectsRect

CGRectContainsPoint

CGRectContainsRect

The CGGeometry Reference har et par andre perler, for eksempel CGPointCreateDictionaryRepresentation for å konvertere en CGPoint struktur til en CFDictionaryRef, og CGRectIsEmpty å sjekke om et rektangel bredde og høyde er lik 0,0. Les dokumentasjonen for den CGGeometry Reference for å finne ut mer.

4. Bonus: Logge

Logging strukturer til Xcode konsoll er tungvint uten noen hjelpefunksjoner. Heldigvis definerer UIKit ramme en håndfull av funksjoner som gjør dette veldig enkelt å gjøre. Jeg bruker dem hele tiden. Ta en titt på følgende kodebiten for å se hvordan de fungerer. Det er ikke rocket science
CGPoint poeng = CGPointMake (10,0, 25,0);. ​​CGSize size = CGSizeMake (103,0, 223,0); CGRect ramme = CGRectMake (point.x, point.y, size.width, size.height); NSLog (@ "\\ n% @ \\ n% @ \\ n% @", NSStringFromCGPoint (punkt), NSStringFromCGSize (størrelse), NSStringFromCGRect (frame));

Det er også praktiske funksjoner for logging affine transformasjoner (NSStringFromCGAffineTransform), edge innfellinger structs (NSStringFromUIEdgeInsets) og offset structs (NSStringFromUIOffset).

Konklusjon

iOS SDK inneholder en rekke perler mange utviklere ikke vet om. Jeg håper jeg har overbevist deg om nytten av CGGeometry Reference. Når du begynner å bruke sin samling av funksjoner, vil du begynne å lure på hvordan du brukte til å klare seg uten den.