私が尋ねた質問は何度も見られているので、詳細な回答を提供します。より正確な内容を追加したい場合は、自由に変更してください。
最初に質問の要約: フレーム、境界、中心、およびそれらの関係。
フレームビューのframe
( ) は、の座標系CGRect
におけるその長方形の位置です。superview
デフォルトでは、左上から開始されます。
境界ビューのbounds
( CGRect
) は、独自の座標系でビューの四角形を表します。
中心Acenter
はの座標系CGPoint
で表されsuperview
、ビューの正確な中心点の位置を決定します。
UIView + positionから取得したこれらは、前のプロパティ間の関係です (非公式の方程式であるため、コードでは機能しません)。
注:ビューが回転している場合、これらの関係は適用されません。詳細については、スタンフォード CS193pコースに基づいてThe Kitchen Drawerから取得した次の画像をご覧になることをお勧めします。クレジットは@Rhubarbに送られます。

を使用するframe
と、 内でビューの位置やサイズを変更できますsuperview
。通常はsuperview
、特定のサブビューを作成する場合などに使用できます。例えば:
// 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];
内に描画するための座標が必要な場合は、view
通常 を参照しbounds
ます。典型的な例はview
、サブビュー内で最初のインセットとして描画することです。サブビューを描画するにbounds
は、スーパービューの を知る必要があります。例えば:
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];
ビューの を変更すると、さまざまな動作が発生しますbounds
。たとえば、 を変更するbounds
size
と、 もframe
変更されます (逆も同様です)。ビューの周りで変化が起こりcenter
ます。以下のコードを使用して、何が起こるかを確認してください。
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));
さらに、bounds
origin
変更するorigin
と、その内部座標系が変更されます。デフォルトでorigin
は(0.0, 0.0)
(左上隅) にあります。たとえば、origin
forを変更するとview1
(必要に応じて前のコードをコメントしてください)、 for の左上隅がそれにview2
触れていることがわかりますview1
。動機は至ってシンプル。view1
左上隅が の位置にあると言いますが、は から始まる(20.0, 20.0)
ので、一致します。view2
frame
origin
(20.0, 20.0)
CGRect frame = view1.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view1.bounds = frame;
はその中の の位置をorigin
表しますが、中心の位置を表します。view
superview
bounds
最後に、bounds
とorigin
は関連する概念ではありません。どちらもビューの を導出できframe
ます (前の式を参照)。
View1 のケーススタディ
次のスニペットを使用するとどうなるかを次に示します。
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]));
相対イメージ。

[self view]
代わりに、次のように境界を変更するとどうなりますか。
// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x += 30.0f;
rect.origin.y += 20.0f;
[[self view] setBounds:rect];
相対イメージ。

[self view]
ここで、左上隅が (30.0, 20.0) の位置にあると言いますが、view1
のフレームの原点は (30.0, 20.0) から始まるため、それらは一致します。
追加の参照(必要に応じて他の参照で更新するため)
についてclipsToBounds
(ソース Apple doc)
この値を YES に設定すると、サブビューがレシーバーの境界にクリップされます。NO に設定すると、フレームがレシーバーの可視境界を超えて伸びるサブビューはクリップされません。デフォルト値は NO です。
つまり、ビューframe
が で(0, 0, 100, 100)
、そのサブビューが(90, 90, 30, 30)
である場合、そのサブビューの一部のみが表示されます。後者は、親ビューの境界を超えません。
masksToBounds
と同等clipsToBounds
です。の代わりにUIView
、このプロパティは に適用されますCALayer
。内部では、 をclipsToBounds
呼び出しますmasksToBounds
。詳細については、UIView の clipsToBounds と CALayer の maskToBounds との関係はどのようになっていますか?を参照してください。.