2012年8月4日土曜日

frameとboundsの違い

UIViewのプロパティである「frame」と「bounds」の違いについてのメモ。

はじめ

この二つは位置やサイズに用いるもので、簡単にまとめると、

  • frame はスーパービュー(親要素)から見た座標
  • bounds はローカルビュー(自身)から見た座標

となります。以下のアップル公式の資料に掲載されているイメージを見ると分かりやすいです。


引用:iOS Viewプログラミングガイド

確かめる

二つのビューを生成して確かめてみます。

//viewAの生成
UIView *viewA = [[UIView alloc] init];
viewA.frame = CGRectMake(20, 20, 200, 300);
viewA.backgroundColor = [UIColor redColor];  //背景を赤
[self.view addSubview:viewA];

//viewAのログ
NSLog(@"viewA bounds : origin.x->%f origin.y->%f size.width->%f size.height->%f", viewA.bounds.origin.x,
viewA.bounds.origin.y, viewA.bounds.size.width, viewA.bounds.size.height);
NSLog(@"viewA frame : origin.x->%f origin.y->%f size.width->%f size.height->%f", viewA.frame.origin.x, viewA.frame.origin.y, viewA.frame.size.width, viewA.frame.size.height);

//viewBの生成
UIView *viewB = [[UIView alloc] init];
viewB.frame = CGRectMake(20, 20, 100, 100);
viewB.backgroundColor = [UIColor blueColor];  //背景を青
[viewA addSubview:viewB];

// viewBのログ
NSLog(@"viewB bounds : origin.x->%f origin.y->%f size.width->%f size.height->%f", viewB.bounds.origin.x, viewB.bounds.origin.y, viewB.bounds.size.width, viewB.bounds.size.height);
NSLog(@"viewB frame : origin.x->%f origin.y->%f size.width->%f size.height->%f", viewB.frame.origin.x, viewB.frame.origin.y, viewB.frame.size.width, viewB.frame.size.height);

ログ

viewA bounds : origin.x->0.000000 origin.y->0.000000 size.width->200.000000 size.height->300.000000
viewA frame : origin.x->20.000000 origin.y->20.000000 size.width->200.000000 size.height->300.000000
viewB bounds : origin.x->0.000000 origin.y->0.000000 size.width->100.000000 size.height->100.000000
viewB frame : origin.x->20.000000 origin.y->20.000000 size.width->100.000000 size.height->100.000000

originは左上隅、sizeは大きさを取得します。

実行画像



参考記事

[Objective-C][Debug][Xcode][iPhone]いまさら聞けないUIView(1)「frameとboundsの違い - BAD_ACCESS
[XCODE] UIViewのframeとboundsとcenterの意味を整理してみた YoheiM.NET
UIView の表示位置を変更する : Objective-C プログラミング - EZ-NET

0 件のコメント:

コメントを投稿