Chciałbym wiedzieć, jak korzystać z tych właściwości we właściwy sposób.
Jak rozumiem, frame
można go używać z kontenera widoku, który tworzę. Ustawia pozycję widoku względem widoku kontenera. Ustawia także rozmiar tego widoku.
Również center
może być używany z pojemnika widoku tworzę. Ta właściwość zmienia pozycję widoku względem jego kontenera.
Wreszcie bounds
odnosi się do samego widoku. Zmienia obszar rysowania widoku.
Czy możesz podać więcej informacji na temat relacji między frame
i bounds
? Co o clipsToBounds
i masksToBounds
właściwości?
Odpowiedzi:
Ponieważ pytanie, które zadałem, było wielokrotnie widziane, udzielę szczegółowej odpowiedzi na to pytanie. Zmodyfikuj go, jeśli chcesz dodać więcej poprawnych treści.
Najpierw podsumowanie pytania: ramy, granice i centrum oraz ich relacje.
Ramka Widok
frame
(CGRect
) to pozycja jego prostokąta w układziesuperview
współrzędnych. Domyślnie zaczyna się w lewym górnym rogu.Granice Widok
bounds
(CGRect
) wyraża prostokąt widoku we własnym układzie współrzędnych.Środek A
center
jestCGPoint
wyrażony w kategoriachsuperview
układu współrzędnych i określa położenie dokładnie środkowego punktu widoku.Wzięte z pozycji UIView + są to relacje (nie działają w kodzie, ponieważ są nieformalnymi równaniami) wśród poprzednich właściwości:
frame.origin = center - (bounds.size / 2.0)
center = frame.origin + (bounds.size / 2.0)
frame.size = bounds.size
UWAGA: Te relacje nie mają zastosowania, jeśli widoki są obracane. Aby uzyskać więcej informacji, zasugeruję, abyś spojrzał na poniższe zdjęcie zrobione z The Kitchen Drawer na podstawie kursu Stanford CS193p . Kredyty trafiają do @ Rabarbaru .
Korzystanie z
frame
umożliwia zmianę położenia i / lub zmianę rozmiaru widoku w jego obrębiesuperview
. Zwykle można go użyćsuperview
na przykład podczas tworzenia określonego widoku podrzędnego. Na przykład:Kiedy potrzebujesz współrzędnych do rysowania w środku
view
, zwykle się do niego odwołujeszbounds
. Typowym przykładem może być narysowanie wview
widoku częściowym jako wstawka pierwszego. Narysowanie rzutu podrzędnego wymaga znajomościbounds
superwizji. Na przykład:Różne zachowania występują po zmianie
bounds
widoku. Na przykład, jeśli zmieniszbounds
size
,frame
zmiany (i odwrotnie). Zmiana następuje wokółcenter
widoku. Użyj poniższego kodu i zobacz, co się stanie:Ponadto, jeśli zmienisz
bounds
origin
, zmieniszorigin
jego wewnętrzny układ współrzędnych. Domyślnieorigin
jest w(0.0, 0.0)
(lewy górny róg). Na przykład, jeśli zmieniszorigin
dlaview1
widać (komentarz poprzedni kod, jeśli chcesz), że teraz w lewym górnym rogu naview2
dotknieview1
jeden. Motywacja jest dość prosta. Mówiszview1
, że jej lewym górnym rogu znajduje się teraz w położeniu(20.0, 20.0)
, ale ponieważview2
„sframe
origin
zaczyna się od(20.0, 20.0)
, będą zbieżne.origin
Reprezentujeview
„S pozycję w obrębie swojegosuperview
ale określa położeniebounds
środka.Wreszcie
bounds
iorigin
nie są powiązanymi pojęciami. Oba pozwalają na wyprowadzenieframe
widoku (patrz poprzednie równania).Studium przypadku View1
Oto, co dzieje się podczas korzystania z następującego fragmentu kodu.
Względny obraz.
To zamiast tego dzieje się, jeśli zmienię
[self view]
granice w następujący sposób.Względny obraz.
Mówisz tutaj,
[self view]
że jego lewy górny róg jest teraz w pozycji (30,0, 20,0), ale ponieważview1
początek ramki zaczyna się od (30,0, 20,0), będą one zbieżne.Dodatkowe odniesienia (w razie potrzeby zaktualizuj o inne odniesienia)
Informacje
clipsToBounds
(źródłowy dokument Apple)Innymi słowy, jeśli widok
frame
jest,(0, 0, 100, 100)
a jego widok podrzędny jest(90, 90, 30, 30)
, zobaczysz tylko część tego widoku podrzędnego. Ten ostatni nie przekroczy granic widoku nadrzędnego.masksToBounds
jest równoważne zclipsToBounds
. ZamiastUIView
tego właściwość ta jest stosowana doCALayer
. Pod maskąclipsToBounds
nazywamasksToBounds
. W celu uzyskania dalszych odniesień zapoznaj się z relacją między klipami UIView clipsToBounds i CALayer masksToBounds? .źródło
To pytanie ma już dobrą odpowiedź, ale chcę je uzupełnić kilkoma zdjęciami. Moja pełna odpowiedź jest tutaj.
Aby pomóc mi zapamiętać ramkę , myślę o ramce na ścianie . Podobnie jak obraz można przenieść w dowolne miejsce na ścianie, układ współrzędnych ramki widoku jest superwizorem. (ściana = superview, frame = view)
Aby pomóc mi zapamiętać granice , myślę o granicach boiska do koszykówki . Koszykówka jest gdzieś na boisku, tak jak układ współrzędnych granic widoku znajduje się w samym widoku. (boisko = widok, koszykówka / zawodnicy = treść w widoku)
View.center , podobnie jak ramka, również znajduje się we współrzędnych superwizji.
Frame vs Bounds - Przykład 1
Żółty prostokąt reprezentuje ramkę widoku. Zielony prostokąt reprezentuje granice widoku. Czerwona kropka na obu obrazach reprezentuje początek ramki lub granic w ich układach współrzędnych.
Przykład 2
Przykład 3
Przykład 4
Jest to to samo, co w przykładzie 2, z tym wyjątkiem, że tym razem wyświetlana jest cała zawartość widoku, tak jakby wyglądał, gdyby nie został przycięty do granic widoku.
Przykład 5
Ponownie zobacz tutaj moją odpowiedź z dalszymi szczegółami.
źródło
Uważam, że ten obraz jest najbardziej pomocny w zrozumieniu ramki, granic itp.
Należy również pamiętać, że
frame.size != bounds.size
po obróceniu obrazu.źródło
Myślę, że jeśli myślisz od samego początku
CALayer
, wszystko jest bardziej jasne.Ramka nie jest tak naprawdę odrębną właściwością widoku ani warstwy, jest to właściwość wirtualna, obliczona na podstawie granic, pozycji (
UIView
centrum) i transformacji.Tak więc w zasadzie sposób, w jaki układ warstw / widoku jest tak naprawdę decydowany przez te trzy właściwości (i anchorPoint), i żadna z tych trzech właściwości nie zmieni żadnej innej właściwości, tak jak zmiana transformacji nie zmienia granic.
źródło
Istnieją bardzo dobre odpowiedzi ze szczegółowym wyjaśnieniem tego postu. Chciałbym tylko odnieść się do tego, że istnieje inne wyjaśnienie z wizualną reprezentacją znaczenia Frame, Bounds, Center, Transform, Bounds Origin w WWDC 2011 wideo Zrozumienie renderowania UIKit od @ 4: 22 do 20:10
źródło
Po przeczytaniu powyższych odpowiedzi dodam tutaj moje interpretacje.
Załóżmy, przeglądania stron internetowych, przeglądarka internetowa jest twój
frame
, który decyduje, gdzie i jak duży, aby pokazać stronę internetową. Scroller przeglądarkibounds.origin
decyduje, która część strony zostanie wyświetlona.bounds.origin
jest trudny do zrozumienia. Najlepszym sposobem na nauczenie się jest tworzenie aplikacji z pojedynczym widokiem, próba modyfikacji tych parametrów i sprawdzenie, jak zmieniają się widoki podrzędne.źródło