Swift: CGRect, CGSize & CGPoint

you ’ re (probably) doing it wrong

Andyy Hope
andyy Hope

follow
Feb 2, 2016 · 4 min read

on kulunut noin kahdeksan kuukautta siitä, kun ensimmäisen kerran päätin hypätä täysin Swiftin madonreikään. Noiden kuukausien aikana olen hitaasti oppinut lopettamaan Objective-C-tyylisten koodikuvioiden kirjoittamisen Swift-syntaksilla ja alkanut todella hyödyntää uutta kieltä.

mutta yksi asia, jonka olen viime aikoina havainnut, on se, että käytän edelleen rumaa ei-Swiftin kaltaista syntaksia kaikilla CGGeometry rakenteilla.

CGRect, CGSize, CGPoint

C-syntaksi. Lammas suden vaatteissa

minulla on iso tunne, että moni Swiftin Kehittäjä syyllistyy tähän. Käsi ylös, jos olet käyttänyt jompaakumpaa näistä koodissasi:

let rect = CGRectMake(0, 0, 100, 100)let point = CGPointMake(0, 0)let size = CGSizeMake(100, 100)

Update: Swift 3: sta lähtien nämä funktiot on poistettu.

Kyllä, ajattelin niin. Mutta älä huoli, siinä ei ole mitään hävettävää …vielä.

tässä on se vika, että se rikkoo Swiftin koodauskäytäntöä, se toimii edelleen, mutta se näyttää paljon enemmän sellaiselta, että jos se kuuluu Objective-C: hen tai vaikka, uskallanko sanoa, Javaan. * shudders *

kokeneelle iOS-tai OSX-kehittäjälle, lyhyellä vilkaisulla he voisivat helposti kertoa, mitä tuo koodi tekee. He eivät tarvitse argumenttimerkintöjä CGGeometry rakenteita, koska kaikki tuntevat nuo argumentit ja niiden järjestyksen ulkoa.

suuri osa Swiftin tarkoituksesta on ystävällisyyttä kielen tulokkaille sekä ohjelmoinnin aloittajille. Jos he katsoisivat koodia, he eivät tietäisi, mitä numerot edustavat. Vannokaamme siis kaikki olevamme hyviä Swift-kansalaisia ja alkakaamme käyttää Swift-versioita:

let rect = CGRect(x: 0, y: 0, width: 100, height: 100)let size = CGSize(width: 100, height: 100)let point = CGPoint(x: 0, y: 0)

hieman ylimääräistä syntaksia, koodimme monisanaisuus on ensisilmäyksellä täysin ymmärrettävää. Lisäbonuksena CGGeometry struct initializer on myös se, että nyt emme vain käytä CGFloat argumentteina, vaan voimme myös siirtää Int ja Double!

nolla

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

päivitys: Swift 3: sta lähtien nämä funktiot on poistettu.

kun me ollaan siinä, niin käytät varmaan vielä näitäkin, amirite? lel.

näitä pitäisi myös päivittää käyttämään uudempaa, nopeampaa syntaksia. Mutta ei hätää, syntaksi on vain vain ylimääräinen merkki pidempi. Arvaatko, mikä se on?

let rect = CGRect.zerolet size = CGSize.zerolet point = CGPoint.zero

toinen asia, joka saa sinut mukaan tähän on se, että Xcode ’ s syntax highlighter korostaa värimaailmastasi riippuen .zero, tehden siitä sen verran hieman kevyemmän kognitiiviselle kuormituksellesi.

Arvohaku

CGRect frame = CGRectMake(0, 0, 100, 100)CGFloat width = CGRectGetWidth(frame)CGFloat height = CGRectGetHeight(frame)CGFloat maxX = CGRectGetMaxX(frame)CGFloat maxY = CGRectGetMaxY(frame)

Update: Swift 3: sta lähtien nämä funktiot on poistettu.

Jos olisit tai olet edelleen hyvä Objective-C: n kansalainen, olisit käyttänyt näitä arvoherättimiä, kun olisit halunnut tietyn arvon rect: lle. Mutta hetkinen, miksi emme vain pääse käsiksi arvoihin suoraan?

CGFloat width = frame.size.widthCGFloat height = frame.size.height

tästä syystä sovellusten tulisi välttää suoraan CGRect-tietorakenteeseen tallennettujen tietojen lukemista ja kirjoittamista. Käytä sen sijaan tässä kuvattuja funktioita suorakulmioiden manipulointiin ja niiden ominaisuuksien hakemiseen.

— Apple, CGGeometry Reference Documentation

on varmaan vielä paljon teitä, jotka eivät viitsineet tällaisia muodollisuuksia, mutta ei se mitään. Swift on lieventänyt meitä tällaisen unpretty API ja sen sijaan tarjotaan yksinkertainen piste merkintä muuttujia.

let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let width = frame.widthlet height = frame.heightlet maxX = frame.maxXlet maxY = frame.maxY

on paljon enemmän esimerkkejä näistä mukavuuksista saatavilla Swift playgrounds I ’ ve provided to supplement this post. Linkki on sivun alareunassa.

muunneltavuus

let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let view = UIView(frame: frame)view.frame.origin.x += 10

ei ainoastaan pysty muuttamaan näkymän kehyksen yksittäisiä arvoja, vaan pystyy myös korvaamaan kokonaisia alirakenteita kokonaan. Katso:

let view = UIView(frame: .zero)view.frame.size = CGSize(width: 10, height: 10)view.frame.origin = CGPoint(x: 10, y: 10)

jo tämä pieni ominaisuus riittää syyksi lopettaa Objective-C: n käyttö CGRects ilman, että tarvitsee luoda kokonaan uutta ja nollata arvoa. Se oli vain alle kaksi vuotta sitten, että me Objective-C kehittäjät oli pakko kirjoittaa kehyksen muutos koodi näin:

CGRect frame = CGRectMake(0, 0, 100, 100);UIView *view = initWithFrame: frame];CGRect newFrame = view.frame;newFrame.size.width = view.frame.origin.x + 10;view.frame = newFrame;

i don ’ t know about you, but writing that really stressed me out. Luodaan newFrame rakenne view’s frame, muutetaan sitä ja sitten nollataan frame ominaisuus view uudelleen. Ei kiitos, ei enää koskaan.

älä unohda

Uikitin sisällä on myös pari muuta konstruktiota, joihin nämä muutokset soveltuvat:

UIEdgeInsets var edgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
edgeInsets.top += 10UIOffsetvar offset = UIOffset(horizontal: 10, vertical: 10)
offset.vertical += 10

Vastaa

Sähköpostiosoitettasi ei julkaista.