Rama, granice, środek, pochodzenie UIView, kiedy czego użyć?

195

UIViewma właściwości frame, bounds, centeri origin, i wszystkie one wydają się być ze sobą powiązane. Przez większość czasu mam do czynienia z frameustawieniem pozycji i rozmiaruUIView . Rozumiem, że frameużywa globalnego układu współrzędnych i boundsużywa współrzędnych widoku lokalnego (dlatego jego xiy wynoszą 0, ale nie zawsze), ale nadal mylę się, kiedy użyć czego.

Pod jakim kontekście (i co raz prawy) inne właściwości ( bounds, center, origin) powinny być stosowane?

Dar
źródło
Poniższy link ma najlepszą odpowiedź. stackoverflow.com/questions/5361369/…
Ohmy,
Frame vs Bounds ze zdjęciami: stackoverflow.com/a/28917673/3681880
Suragch

Odpowiedzi:

240

Powyższa odpowiedź Marco jest poprawna, ale tylko po to, aby rozwinąć kwestię „w jakim kontekście” ...

rama - jest to właściwość, której najczęściej używasz do zwykłych aplikacji na iPhone'a. większość elementów sterujących zostanie rozmieszczonych względem kontrolki „zawierającej”, dzięki czemu ramka.origin będzie bezpośrednio odpowiadać miejscu, w którym kontrolka musi wyświetlić, a rozmiar ramki określi, jak duży ma być kontrolka.

centrum - jest to właściwość, na której prawdopodobnie skupisz się w grach opartych na ikonach i animacjach, w których może wystąpić ruch lub skalowanie. Domyślnie animacja i obrót będą oparte na środku UIView. Rzadko ma sens próba zarządzania takimi obiektami za pomocą właściwości ramki.

bounds - ta właściwość nie jest właściwością pozycjonowania, ale definiuje obszar rysowania „UIView” względem ramki. Domyślnie ta właściwość to zwykle (0, 0, szerokość , wysokość ). Zmiana tej właściwości pozwoli ci rysować poza ramką lub ograniczyć rysowanie do mniejszego obszaru w ramce. Dobre omówienie tego można znaleźć pod linkiem poniżej. Rzadko można manipulować tą właściwością, chyba że istnieje szczególna potrzeba dostosowania regionu rysowania. Jedynym wyjątkiem jest to, że większość programów użyje opcji [[UIScreen mainScreen] bounds]przy uruchomieniu do określenia widocznego obszaru aplikacji i odpowiednio skonfiguruje ramkę początkowego UIView.

Dlaczego w UIView jest prostokąt ramki i prostokąt obwiedni?

Mamy nadzieję, że pomoże to wyjaśnić okoliczności, w których każda nieruchomość może zostać wykorzystana.

Barney Mattox
źródło
33
Myślę, że warto dodać, że boundssą one powszechnie używane, gdy do widoku zastosowano transformację. W tych okolicznościach framewłaściwość jest niezdefiniowana. Jak wskazano w innych odpowiedziach, modyfikowanie centeri boundssą równoważne odpowiednio modyfikacji pozycji i rozmiaru widoku.
Stuart,
36

Są to powiązane wartości i są spójne za pomocą metod ustawiających / pobierających właściwości (i wykorzystując fakt, że ramka jest czysto zsyntetyzowaną wartością, nie popartą rzeczywistą zmienną instancji).

Główne równania to:

frame.origin = center - bounds.size / 2

(który jest taki sam jak)

center = frame.origin + bounds.size / 2

(i jest też)

frame.size = bounds.size

To nie jest kod, tylko równania wyrażające niezmienność między trzema właściwościami. Równania te zakładają również, że transformacja widoku jest tożsamością, która jest domyślnie. Jeśli tak nie jest, wówczas granice i środek zachowują to samo znaczenie, ale ramka może się zmienić. O ile nie wykonujesz obrotu poza kątem prostym, ramka zawsze będzie przekształconym widokiem pod względem współrzędnych superwizji.

Wszystko to wyjaśniono bardziej szczegółowo w przydatnej mini-bibliotece tutaj:

http://bynomial.com/blog/?p=24

Tyler
źródło
18

Właściwości center, boundsa framesą blokowane: zmiana będzie jeden aktualizować innych, więc używaj ich jednak chcesz. Na przykład zamiast modyfikować parametry x / y, frameaby ponownie wyśrodkować widok, wystarczy zaktualizować centerwłaściwość.

Marco Mustapic
źródło