[解決済み】UIViewのフレーム、バウンド、センター
質問
これらのプロパティの正しい使い方を知りたいです。
私の理解では
frame
は、作成中のビューのコンテナから使用することができます。
これは、コンテナビューに対するビューの位置を設定します。また、そのビューのサイズも設定します。
また
center
は、作成するビューのコンテナから使用することができます。このプロパティは、コンテナに対するビューの相対的な位置を変更します。
最後に
bounds
は、ビュー自体に対する相対的なものです。これは、ビューの描画可能領域を変更します。
との関係について、もう少し詳しく教えてください。
frame
と
bounds
? はどうでしょうか?
clipsToBounds
と
masksToBounds
のプロパティは?
解決方法は?
私が尋ねた質問は何度も見られているので、私はそれの詳細な答えを提供します。もし、より正しい内容を追加したい場合は、自由に修正してください。
まず最初に、フレーム、バウンド、センターとそれらの関係について復習しておきましょう。
フレーム
ビューの
frame
(
CGRect
) は、その矩形の位置が
superview
の座標系になります。デフォルトでは、左上から始まります。
境界線
ビューの
bounds
(
CGRect
) は、ビューの矩形をそれ自身の座標系で表現する。
センター
A
center
は
CGPoint
で表現されます。
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
の左上隅にあるのがわかると思います(必要であれば前のコードをコメントしてください)。
view2
は
view1
の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
を中央に配置します。
最後に
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ドキュメント)
この値をYESに設定すると、サブビューが境界線にクリッピングされます。 の受信機です。NO に設定すると、フレームが受信機からはみ出したサブビューは 受信機の可視領域は切り取られない。デフォルトは NO.
つまり、あるビューの
frame
は
(0, 0, 100, 100)
で、そのサブビューは
(90, 90, 30, 30)
の場合、そのサブビューの一部しか表示されません。後者は、親ビューの境界を超えることはありません。
masksToBounds
と同じです。
clipsToBounds
. 代わりに
UIView
に適用され、このプロパティは
CALayer
. ボンネットの中で
clipsToBounds
を呼び出します。
masksToBounds
. さらに詳しい情報は、以下のサイトを参照してください。
UIViewのclipsToBoundsとCALayerのmasksToBoundsはどのような関係にありますか?
.
関連
-
[解決済み] UILabelのフォントサイズ?
-
[解決済み] Cocoa:フレームとバウンドはどう違うの?
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] UIViewに角丸をつける
-
[解決済み] メソッド名と行番号を出力し、NSLogを条件付きで無効にする方法は?
-
[解決済み] UIViewの角丸とドロップシャドウ?
-
[解決済み] Objective-CでNSArrayを逆引きするにはどうしたらいいですか?
-
[解決済み】idの代わりにinstancetypeを使い始めるのは有益でしょうか?
-
[解決済み】Objective-Cでオブジェクトがどのクラスであるかをテストするにはどうすればよいですか?
-
[解決済み] UIViewのフレーム、バウンズ、センター、オリジン、いつ何を使うか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Objective-C。NULL、nil、@""の違いは何ですか?
-
[解決済み] Cocoa:フレームとバウンドはどう違うの?
-
[解決済み] インスタンスに送信されたセレクタが認識されない」を解決するには?
-
[解決済み] Objective-Cで抽象クラスを作成する
-
[解決済み] UITextFieldのテキストインセット?
-
[解決済み】キーボードを簡単に解除する方法は?
-
[解決済み】iOS 7.0とシステム劣化で無効なコンテキスト0x0が表示される
-
[解決済み】NSStringが特定の文字で始まるかどうかを確認する方法
-
[解決済み] UIViewのフレーム、バウンズ、センター、オリジン、いつ何を使うか?
-
[解決済み] UIScrollViewのcontentInsetプロパティは何のためにあるのですか?