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ładzie superview
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
jest CGPoint
wyrażony w kategoriach superview
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:
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ębie superview
. Zwykle można go użyć superview
na przykład podczas tworzenia określonego widoku podrzędnego. Na przykład:
// view1 will be positioned at x = 30, y = 20 starting the top left corner of [self view]
// [self view] could be the view managed by a UIViewController
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
[[self view] addSubview:view1];
Kiedy potrzebujesz współrzędnych do rysowania w środku view
, zwykle się do niego odwołujesz bounds
. Typowym przykładem może być narysowanie w view
widoku częściowym jako wstawka pierwszego. Narysowanie rzutu podrzędnego wymaga znajomości bounds
superwizji. Na przykład:
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
UIView* view2 = [[UIView alloc] initWithFrame:CGRectInset(view1.bounds, 20.0f, 20.0f)];
view2.backgroundColor = [UIColor yellowColor];
[view1 addSubview:view2];
Różne zachowania występują po zmianie bounds
widoku. Na przykład, jeśli zmienisz bounds
size
, frame
zmiany (i odwrotnie). Zmiana następuje wokół center
widoku. Użyj poniższego kodu i zobacz, co się stanie:
NSLog(@"Old Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"Old Center %@", NSStringFromCGPoint(view2.center));
CGRect frame = view2.bounds;
frame.size.height += 20.0f;
frame.size.width += 20.0f;
view2.bounds = frame;
NSLog(@"New Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"New Center %@", NSStringFromCGPoint(view2.center));
Ponadto, jeśli zmienisz bounds
origin
, zmienisz origin
jego wewnętrzny układ współrzędnych. Domyślnie origin
jest w (0.0, 0.0)
(lewy górny róg). Na przykład, jeśli zmienisz origin
dla view1
widać (komentarz poprzedni kod, jeśli chcesz), że teraz w lewym górnym rogu na view2
dotknie view1
jeden. Motywacja jest dość prosta. Mówisz view1
, że jej lewym górnym rogu znajduje się teraz w położeniu (20.0, 20.0)
, ale ponieważ view2
„s frame
origin
zaczyna się od (20.0, 20.0)
, będą zbieżne.
CGRect frame = view1.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view1.bounds = frame;
origin
Reprezentuje view
„S pozycję w obrębie swojego superview
ale określa położenie bounds
środka.
Wreszcie bounds
i origin
nie są powiązanymi pojęciami. Oba pozwalają na wyprowadzenie frame
widoku (patrz poprzednie równania).
Studium przypadku View1
Oto, co dzieje się podczas korzystania z następującego fragmentu kodu.
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
[[self view] addSubview:view1];
NSLog(@"view1's frame is: %@", NSStringFromCGRect([view1 frame]));
NSLog(@"view1's bounds is: %@", NSStringFromCGRect([view1 bounds]));
NSLog(@"view1's center is: %@", NSStringFromCGPoint([view1 center]));
Względny obraz.
To zamiast tego dzieje się, jeśli zmienię [self view]
granice w następujący sposób.
// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x += 30.0f;
rect.origin.y += 20.0f;
[[self view] setBounds:rect];
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)
Ustawienie tej wartości na TAK powoduje przycięcie widoków podrzędnych do granic odbiornika. Jeśli ustawione na NIE, widoki podrzędne, których ramki wykraczają poza widoczne granice odbiornika, nie są przycinane. Wartość domyślna to NIE.
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 z clipsToBounds
. Zamiast UIView
tego właściwość ta jest stosowana do CALayer
. Pod maską clipsToBounds
nazywa masksToBounds
. W celu uzyskania dalszych odniesień zapoznaj się z relacją między klipami UIView clipsToBounds i CALayer masksToBounds? .