1. ホーム
  2. オブジェクティブC

[解決済み】UIViewのフレーム、バウンド、センター

2022-05-02 16:11:43

質問

これらのプロパティの正しい使い方を知りたいです。

私の理解では frame は、作成中のビューのコンテナから使用することができます。 これは、コンテナビューに対するビューの位置を設定します。また、そのビューのサイズも設定します。

また center は、作成するビューのコンテナから使用することができます。このプロパティは、コンテナに対するビューの相対的な位置を変更します。

最後に bounds は、ビュー自体に対する相対的なものです。これは、ビューの描画可能領域を変更します。

との関係について、もう少し詳しく教えてください。 framebounds ? はどうでしょうか? clipsToBoundsmasksToBounds のプロパティは?

解決方法は?

私が尋ねた質問は何度も見られているので、私はそれの詳細な答えを提供します。もし、より正しい内容を追加したい場合は、自由に修正してください。

まず最初に、フレーム、バウンド、センターとそれらの関係について復習しておきましょう。

フレーム ビューの frame ( CGRect ) は、その矩形の位置が superview の座標系になります。デフォルトでは、左上から始まります。

境界線 ビューの bounds ( CGRect ) は、ビューの矩形をそれ自身の座標系で表現する。

センター A centerCGPoint で表現されます。 superview の座標系で、ビューの正確な中心点の位置が決定される。

より引用 UIView + 位置 これらは、前のプロパティの関係です(非公式な方程式なので、コードでは機能しません)。

  • frame.origin = center - (bounds.size / 2.0)

  • center = frame.origin + (bounds.size / 2.0)

  • frame.size = bounds.size

NOTE これらの関係は、ビューを回転させた場合には適用されません。詳細については、次の画像を見てください。 キッチンの引き出し をベースに スタンフォード CS193p コースです。クレジットはこちら ルバーブ .

を使用することで 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 に対して view1 の左上隅にあるのがわかると思います(必要であれば前のコードをコメントしてください)。 view2view1 の1つです。動機は非常にシンプルです。あなたは、次のように言います。 view1 の位置で、その左上角が (20.0, 20.0) しかし view2 's 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 を中央に配置します。

最後に boundsorigin は関連性のない概念です。どちらも 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ドキュメント)

<ブロッククオート

この値をYESに設定すると、サブビューが境界線にクリッピングされます。 の受信機です。NO に設定すると、フレームが受信機からはみ出したサブビューは 受信機の可視領域は切り取られない。デフォルトは NO.

つまり、あるビューの frame(0, 0, 100, 100) で、そのサブビューは (90, 90, 30, 30) の場合、そのサブビューの一部しか表示されません。後者は、親ビューの境界を超えることはありません。

masksToBounds と同じです。 clipsToBounds . 代わりに UIView に適用され、このプロパティは CALayer . ボンネットの中で clipsToBounds を呼び出します。 masksToBounds . さらに詳しい情報は、以下のサイトを参照してください。 UIViewのclipsToBoundsとCALayerのmasksToBoundsはどのような関係にありますか? .