UIView
ma właściwości frame
, bounds
, center
i origin
, i wszystkie one wydają się być ze sobą powiązane. Przez większość czasu mam do czynienia z frame
ustawieniem pozycji i rozmiaruUIView
. Rozumiem, że frame
używa globalnego układu współrzędnych i bounds
uż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?
Odpowiedzi:
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.
źródło
bounds
są one powszechnie używane, gdy do widoku zastosowano transformację. W tych okolicznościachframe
właściwość jest niezdefiniowana. Jak wskazano w innych odpowiedziach, modyfikowaniecenter
ibounds
są równoważne odpowiednio modyfikacji pozycji i rozmiaru widoku.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:
(który jest taki sam jak)
(i jest też)
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
źródło
Właściwości
center
,bounds
aframe
są blokowane: zmiana będzie jeden aktualizować innych, więc używaj ich jednak chcesz. Na przykład zamiast modyfikować parametry x / y,frame
aby ponownie wyśrodkować widok, wystarczy zaktualizowaćcenter
właściwość.źródło