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 superviewwspół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 centerjest CGPointwyrażony w kategoriach superviewukł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 frameumożliwia zmianę położenia i / lub zmianę rozmiaru widoku w jego obrębie superview. Zwykle można go użyć superviewna 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 viewwidoku częściowym jako wstawka pierwszego. Narysowanie rzutu podrzędnego wymaga znajomości boundssuperwizji. 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 boundswidoku. Na przykład, jeśli zmienisz bounds size, framezmiany (i odwrotnie). Zmiana następuje wokół centerwidoku. 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 originjego wewnętrzny układ współrzędnych. Domyślnie originjest w (0.0, 0.0)(lewy górny róg). Na przykład, jeśli zmienisz origindla view1widać (komentarz poprzedni kod, jeśli chcesz), że teraz w lewym górnym rogu na view2dotknie view1jeden. 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 originzaczyna 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;
originReprezentuje view„S pozycję w obrębie swojego superviewale określa położenie boundsśrodka.
Wreszcie boundsi originnie są powiązanymi pojęciami. Oba pozwalają na wyprowadzenie framewidoku (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ż view1począ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 framejest, (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.
masksToBoundsjest równoważne z clipsToBounds. Zamiast UIViewtego właściwość ta jest stosowana do CALayer. Pod maską clipsToBoundsnazywa masksToBounds. W celu uzyskania dalszych odniesień zapoznaj się z relacją między klipami UIView clipsToBounds i CALayer masksToBounds? .