Poiché la domanda che ho posto è stata vista molte volte, fornirò una risposta dettagliata. Sentiti libero di modificarlo se vuoi aggiungere altro contenuto corretto.
Innanzitutto un riassunto della domanda: cornice, limiti e centro e le loro relazioni.
Frame Una vista frame( CGRect) è la posizione del suo rettangolo nel superviewsistema di coordinate. Di default inizia in alto a sinistra.
Limiti Una vista bounds( CGRect) esprime un rettangolo vista nel proprio sistema di coordinate.
Il centro A centerè CGPointespresso in termini di superviewsistema di coordinate del e determina la posizione del punto centrale esatto della vista.
Tratte da UIView + position, queste sono le relazioni (non funzionano nel codice poiché sono equazioni informali) tra le proprietà precedenti:
NOTA: queste relazioni non si applicano se le viste sono ruotate. Per ulteriori informazioni, ti suggerirò di dare un'occhiata alla seguente immagine tratta da The Kitchen Drawer basata sul corso Stanford CS193p . I crediti vanno a @Rhubarb .

L'uso di frameconsente di riposizionare e / o ridimensionare una vista al suo interno superview. Di solito può essere utilizzato da un superview, ad esempio, quando si crea una vista secondaria specifica. Per esempio:
// 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];
Quando hai bisogno delle coordinate per disegnare all'interno di una a viewcui di solito ti riferisci bounds. Un esempio tipico potrebbe essere quello di disegnare all'interno di viewuna sottoview come un inserto del primo. Disegnare la sottoview richiede di conoscere boundsla superview. Per esempio:
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];
Si verificano comportamenti diversi quando si cambia la boundsvista. Ad esempio, se si cambiano le bounds size, le framemodifiche (e viceversa). Il cambiamento avviene attorno centeralla vista. Usa il codice qui sotto e guarda cosa succede:
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));
Inoltre, se si cambia, bounds originsi modifica il originrelativo sistema di coordinate interno. Di default originè a (0.0, 0.0)(angolo in alto a sinistra). Ad esempio, se cambi il originper view1puoi vedere (commenta il codice precedente se vuoi) che ora l'angolo in alto a sinistra view2tocca view1quello. La motivazione è abbastanza semplice. Tu dici a view1che il suo angolo in alto a sinistra è ora nella posizione (20.0, 20.0), ma dal momento che view2's frame originparte da (20.0, 20.0), essi coincidono.
CGRect frame = view1.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view1.bounds = frame;
Il originrappresenta la viewposizione del suo superviewma descrive la posizione delbounds centro.
Infine, boundse originnon sono concetti correlati. Entrambi consentono di derivare la framevista (Vedi equazioni precedenti).
Caso di studio di View1
Ecco cosa succede quando si utilizza il seguente frammento.
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]));
L'immagine relativa.

Questo invece cosa succede se cambio [self view]limiti come il seguente.
// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x += 30.0f;
rect.origin.y += 20.0f;
[[self view] setBounds:rect];
L'immagine relativa.

Qui dici [self view]che il suo angolo in alto a sinistra ora è nella posizione (30.0, 20.0) ma poiché view1l'origine del frame inizia da (30.0, 20.0), coincideranno.
Riferimenti aggiuntivi (da aggiornare con altri riferimenti se lo si desidera)
Informazioni clipsToBounds(fonte Apple doc)
Impostando questo valore su SÌ, i sottoview vengono ritagliati ai limiti del ricevitore. Se impostato su NO, le visualizzazioni secondarie i cui frame si estendono oltre i limiti visibili del ricevitore non vengono ritagliate. Il valore predefinito è no.
In altre parole, se la vista frameè (0, 0, 100, 100)e la sua vista secondaria è (90, 90, 30, 30), vedrai solo una parte di quella vista secondaria. Quest'ultimo non supererà i limiti della vista padre.
masksToBoundsè equivalente a clipsToBounds. Invece a a UIView, questa proprietà viene applicata a CALayer. Sotto il cofano, clipsToBoundschiama masksToBounds. Per ulteriori riferimenti, dai un'occhiata a Come è la relazione tra i clip di UIViewToBounds e le maschere di CALayerToBounds? .