Swift: CGRect, CGSize & CGPoint

robisz (prawdopodobnie) źle

Andyy Hope
andyy hope

Follow

Feb 2, 2016 · 4 min read

minęło około ośmiu miesięcy, odkąd po raz pierwszy zdecydowałem się całkowicie wskoczyć do tunelu SWIFT. Przez te miesiące powoli nauczyłem się przestać pisać wzorce kodu w stylu Objective-C z szybką składnią i zacząłem faktycznie korzystać z nowego języka.

ale jedną rzeczą, którą ostatnio zauważyłem, jest to, że nadal używam brzydkiej składni podobnej do Swift ze wszystkimi moimi strukturami CGGeometry.

CGRect, CGSize, CGPoint

składnia C. Owca w Wilczej skórze

mam duże przeczucie, że wielu programistów Swift będzie temu winnych. Podnieś rękę, jeśli używałeś któregokolwiek z nich w swoim kodzie:

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

Aktualizacja: od Swift 3 Funkcje te zostały usunięte.

Ale nie martw się, nie ma się czego wstydzić …jeszcze.

rzecz w tym, że łamie konwencję kodowania Swifta, nadal będzie działać, ale wygląda bardziej jak coś, co jeśli należy do Objective-C lub nawet, ośmielę się powiedzieć, Java. * dreszcze *

do doświadczonego programisty iOS lub OSX, z krótkim spojrzeniem mogą łatwo powiedzieć, co robi ten kod. Nie potrzebują etykiet argumentów w strukturachCGGeometry, ponieważ każdy zna te argumenty i ich sekwencję na pamięć.

wiele z tego, co Swift jest o to, aby być przyjaznym dla nowych języków, jak również początkujących programistów. Gdyby spojrzeli na ten kod, nie mieliby pojęcia, co oznaczają te liczby. Więc ślubujmy być dobrymi obywatelami Swift i zacznijmy używać wersji Swift:

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)

dla trochę dodatkowej składni, gadatliwość naszego kodu jest całkowicie zrozumiała na pierwszy rzut oka. Dodatkową zaletą używaniaCGGeometry inicjalizatora struktury jest to, że teraz nie ograniczamy się tylko do używaniaCGFloat jako argumentów, możemy również przekazaćInt IDouble!

Zero

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

Aktualizacja: od Swift 3 Funkcje te zostały usunięte.

skoro już o tym mowa, to pewnie jeszcze ich używasz, amirite? lel.

powinniśmy je również aktualizować, aby używać nowszej, szybszej składni. Ale nie martw się, składnia jest tylko dodatkowym znakiem dłuższym. Zgadniesz, co to jest?

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

kolejną rzeczą, która pomoże Ci w tym, jest to, że zakreślacz składni Xcode, w zależności od schematu kolorów, podświetli.zero, dzięki czemu będzie nieco lżejszy na Twoim obciążeniu poznawczym.

pobieranie wartości

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

Aktualizacja: od Swift 3 Funkcje te zostały usunięte.

gdybyś był lub nadal jesteś dobrym obywatelem Objective-C, użyłbyś tych getterów wartości, gdy chciałeś określonej wartości rect. Ale poczekaj chwilę, dlaczego nie uzyskamy bezpośredniego dostępu do wartości?

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

z tego powodu aplikacje powinny unikać bezpośredniego odczytu i zapisu danych zapisanych w strukturze danych CGRect. Zamiast tego użyj funkcji opisanych tutaj do manipulowania prostokątami i pobierania ich cech.

— Apple, dokumentacja CGG

pewnie wielu z Was nie zawracało sobie głowy takimi formalnościami, ale jest ok. Swift złagodził nas z takiego bezpretensjonalnego API i zamiast tego dostarczył proste zmienne notacji kropkowej.

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

na placach zabaw Swift, które podałem w celu uzupełnienia tego posta, dostępnych jest wiele innych przykładów tych fajnych zabaw. Link będzie na dole strony.

zmienność

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

nie tylko możesz zmienić poszczególne wartości ramki widoku, ale także możesz całkowicie zastąpić całe podpowstruktury. Oto:

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

Ta mała funkcja jest wystarczającym powodem, aby przestać używać Objective-C. zmienność naCGRect s bez konieczności tworzenia nowej całkowicie i resetowania wartości. Dopiero niecałe dwa lata temu jako programiści Objective-C byliśmy zmuszeni do napisania kodu modyfikacji ramki w ten sposób:

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;

Nie wiem jak wy, ale pisanie to mnie naprawdę stresowało. Utworzenie strukturynewFrame z ramkiview, zmodyfikowanie jej, a następnie ponowne zresetowanie właściwościframe naview. Nie, dziękuję, nigdy więcej, proszę.

nie zapomnij

istnieje również kilka innych konstrukcji w UIKit, dla których te zmiany mają zastosowanie do:

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.