iOS Tips #1 Core Graphicsのマクロやら

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CGRectの便利マクロ

iOSでボタンやら画像やら表示する上で避けては通れないCGなんちゃら。CGRectやらCGSizeやら最初はわかりませんでした。特にUIViewのframeboundsを理解するのに手こずったのはいい思い出です。

このCGRect型のプロパティであるframeとboundsですが、ご存知の通り変更するのがめんどくさいです。

例えば、X座標だけ移動したい場合でも以下のように書かなければなりません。

// UIViewのX座標を変える。その1
CGFloat x = 100;
aView.frame = CGRectMake(x, aView.frame.origin.y, aView.frame.size.width, aView.frame.size.height);

// UIViewのX座標を変える。その2
CGFloat x = 100;
CGRect frame = aView.frame;
frame.x = x;
aView.frame = frame;

これは面倒くさいのでマクロを定義しましょう(結構やってる人多いと思いますが)。以下のソースを適当な場所(私はMathUtil.hなどを作ってそこに書いてます)に貼付けましょう。

// CGRectにCGPointをセット
#define CGRectSetPosition(r, p)             CGRectMake(p.x, p.y, r.size.width, r.size.height)

// CGRectにX座標とY座標をセット
#define CGRectSetXY(r, x, y)                CGRectMake(x, y, r.size.width, r.size.height)

// CGRectにX座標をセット
#define CGRectSetX(r, x)                    CGRectMake(x, r.origin.y, r.size.width, r.size.height)

// CGRectにY座標をセット
#define CGRectSetY(r, y)                    CGRectMake(r.origin.x, y, r.size.width, r.size.height)

// CGRectにCGSizeをセット
#define CGRectSetSize(r, s)                 CGRectMake(r.origin.x, r.origin.y, s.width, s.height)

// CGRectに幅と高さをセット
#define CGRectSetWidthAndHeight(r, w, h)    CGRectMake(r.origin.x, r.origin.y, w, h)

// CGRectに幅をセット
#define CGRectSetWidth(r, w)                CGRectMake(r.origin.x, r.origin.y, w, r.size.height)

// CGRectに高さをセット
#define CGRectSetHeight(r, h)               CGRectMake(r.origin.x, r.origin.y, r.size.width, h)

このマクロを使用すると、先ほどの例のようにX座標を変更する場合、以下のように記述できます。

aView.frame = CGRectSetX(aView.frame, x);

かんたんだ!なんで標準でないんでしょうね?

CGなんちゃら系のデバッグ

ちゃんとframeやboundsに値が設定されているか確認したいときが多々あります。そういうときは大抵NSLogでコンソールに表示するわけですが、そんなとき以下の関数が役に立ちます。

// CGRectを文字列に
NSStringFromCGRect(aView.frame);

// CGSizeを文字列に
NSStringFromCGSize(aView.frame.size);

// CGPointを文字列に
NSStringFromCGPoint(aView.frame.point);

// CGAffineTransformを文字列に
NSStringFromCGAffineTransform(aView.transform);

例えば、CGRectをNSLogするときは、

NSLog(@"aView.frame: %@", NSStringFromCGRect(aView.frame));

この関数って存在感なくて最初気づかないんですよね〜。

以上、短いですがCore GraphicsのTipsでした!