位置と大きさに関する属性を扱う場合には、これらの値の構造について理解しておく必要があります。位置と大きさは、「
CGRect」「
CGPoint」「
CGSize」という3つの構造体の組汗によって構成されているからです。これらは、それぞれ以下のような役割を果たします。
CGPoint位置を示すためのものです。「
x」「
y」といった要素を持っており、これらから縦横の位置の値を得ることができます。構造体の作成は、「
CGPointMake」という以下のような関数を利用します(引数はそれぞれ
CGFloat値です)。
CGPointMake( 横位置 , 縦位置 );
CGSize大きさを示すためのものです。「
width」「
height」といった要素を持っています。これも構造体作成は「
CGSieMake」関数を使います。(引数はやはり
GCFloat値)
CGSizeMake( 横幅 , 縦幅 );
CGRect領域を示すためのものです。要素として、位置を示す「
origin」、大きさを示す「
size」というものを持っており、これらはそれぞれ
CGPoint、
CGSize構造体の値となっています。また
CGRectは、「
CGRectMake」関数を使い以下のように作成することができます(引数は
CGFloat値)
CGRectMake( 横位置 , 縦位置 , 横幅 , 縦幅 );
コンポーネントの配置エリアは、「
frame」という属性として用意されています。これは、
CGRect値として設定されます。ややこしいのは、この
CGRectは、
CGPointと
CGSizeの組合わせによって値が構成されている、ということでしょう。
したがって、
frameプロパティから取り出した
CGRectから細かな値を取り出すには、その中の
CGPointと
CGSizeから更に値を取り出す、ということをしないといけないのです。
下に、コンポーネントの表示エリアを操作する簡単なサンプルをあげておきます。
UILabelと
UIButtonが配置されている状態で、ボタンをクリックすると、表示されている
ULabelの表示エリアが少しずつ変化していきます。
ここでは、
[label1 frame]で
CGRect値を取得した後、
CGRectMake関数で新たに設定する
CGRect値を作成してから
setFrame:で設定をしています。
CGRectMake関数では、取り出した
CGRectから位置や大きさの値を取り出し、それに加算減算して新しい値を設定しています。
※MyIAppViewController.h
#import <UIKit/UIKit.h>
@interface MyIAppViewController : UIViewController {
UILabel * label1;
UIButton * button1;
}
@property (nonatomic, retain) IBOutlet UILabel * label1;
@property (nonatomic, retain) IBOutlet
UIButton * button1;
- (IBAction)button1Action:(id)sender;
@end
※MyIAppViewController.m
@implementation MyIAppViewController
@dynamic label1;
@dynamic button1;
- (IBAction)button1Action:(id)sender {
CGRect r = [label1 frame];
CGRect r2 = CGRectMake(r.origin.x + 10,
r.origin.y + 10,
r.size.width - 10,
r.size.height + 10);
[label1 setFrame:r2];
}
……中略……
@end
