CGRectの使い方

3948 ワード

iOS開発では、点、サイズ、矩形の処理がしばしば必要であり、対応するデータ構造はそれぞれCGPoint、CGSize、CGRectであり、これらのデータ構造はC構造体であり、定義はそれぞれ以下の通りである.
CGPoint {
  CGFloat x;
  CGFloat y;
};
CGSize {
  CGFloat width;
  CGFloat height;
};
struct CGRect {
  CGPoint origin;
  CGSize size;
};

これらのデータ構造を操作するには、以下のように簡単な方法があります.
1.CGPoint,CGSize,CGRectの作成
CGSize size = CGSizeMake (10.0, 20.0);
CGPoint center = CGPointMake (60.0, 240.0);
CGRect bounds = CGRectMake (5.0, 10.0, 100.0, 200.0);

いくつかの特殊な情況の零点CGPointZero;すなわち(x=0.0,y=0.0)、GPointMake(0,0)に等価である.ゼロサイズCGSizeZero;すなわち(width=0.0、height=0.0)、CGSizeMake(0,0)に等しい.ゼロ長方形CGRectZero;すなわち(x=0.0,y=0.9),(width=0.0,height=0.0)),CGRectMake(0,0,0)に等価である.空の長方形CGRectNull;2つの交差しない長方形の交差領域をとるとCGRectNullが返され、1つの長方形とCGRectNullの並列セットが元の長方形になります.CGRectIsNullを使用して、長方形がCGRectNullであるかどうかを判断します.CGRectIseEmptyはCGRectZeroとCGRectNullに対してtrueを返します.無限矩形CGRectInfiniteは無限領域の矩形を有し、CGRectIsInfiniteを用いて判断することができる.
2.二つの点、大きさ、矩形が等しいかどうかを判断する
bool CGPointEqualToPoint (CGPoint point1, CGPoint point2);bool CGSizeEqualToSize (CGSize size1, CGSize size2);bool CGRectEqualToRect (CGRect rect1, CGRect rect2);

CGPoint,CGSize,CGRectの内部データはいずれもCGPointであり,浮動小数点数については切り込み誤差がある可能性があるため,両者が等しいか否かを直接判断することはできず,両値の差が十分小さいか否かを判断すべきである.上記の方法を用いると,これらの判断を手作業で行うことを回避し,コードを簡略化することができる.
3.長方形の境界、中点座標値、縦横を取得
境界座標値、すなわちx,yの最大値と最小値を取得します.
CGFloat CGRectGetMinX(CGRect rect);
CGFloat CGRectGetMaxX(CGRect rect);
CGFloat CGRectGetMinY(CGRect rect);
CGFloat CGRectGetMaxY(CGRect rect);

中点座標値、すなわちx,yの中点を取得する
CGFloat CGRectGetMidX(CGRect rect);
CGFloat CGRectGetMidY(CGRect rect);

長方形の長さ、幅を取得
CGFloat CGRectGetWidth(CGRect rect);
CGFloat CGRectGetHeight(CGRect rect);

4.対称インデントCGRect
CGRect aRectangle = CGRectMake(0,0, 100, 200);
CGRect smallerRectangle = CGRectInset(aRectangle, 10, 20);
// result origin (10, 20) and size (80, 160)

5.非対称インデントCGRect
CGRect rect = CGRectMake(0, 0, 100, 200);
UIEdgeInsets contentInsets = UIEdgeInsetsMake(10, 20, 30, 40);
CGRect result = UIEdgeInsetsInsetRect(rect, contentInsets);
//result origin(20,10) and size(40,160)

6.小数画素CGRectを整数画素に調整
origin値を最近接整数に下方修正する、sizeを最近接整数に上方修正することで、生成されたCGRectが元のCGRectを完全に含むことができる.
CGRect rect = CGRectMake(5, 7.5, 50, 29);
UIEdgeInsets contentInsets = UIEdgeInsetsMake(10, 20, 30, 40);
CGRect result = CGRectIntegral(rect);
//result origin(5,7) and size(50,30)

7.長方形に点が含まれているかどうかを確認する
CGRect enemyRect = CGRectMake(0, 0, 100, 200);
CGPoint hitPoint = CGPointMake(50, 50);
if(CGRectContainsPoint(enemyRect, hitPoint))    {
        // YES!
}

8.2つの長方形が交差しているかどうかを確認する
CGRect playerRect = CCRectMake(200, 300, 10, 10);
    CGRect mineRect = CGRectMake(10, 10, 20, 20);
    if(CGRectIntersectsRect(playerRect, mineRect))    {
        // OUCH!
    }

9.CGRectとNSStringの変換
CGRect rect = CGRectMake(0, 0, 100, 200);
   NSString *rectString = NSStringFromCGRect(rect))
   CGRect newRect = CGRectFromString(rectString);

10.CGRectとNSDictionary変換
CGRect rect = CGRectMake(0, 0, 100, 200);
CFDictionaryRef frameDictRef = CGRectCreateDictionaryRepresentation(rect);
NSDictionary*frameDict = [NSDictionary dictionaryWithDictionary:(NSDictionary*)frameDictRef]; // autoreleased
CFRelease(frameDictRef);
NSLog(@"%@", frameDict);

CGRect newRect;
CGRectMakeWithDictionaryRepresentation((CFDictionaryRef)frameDict, &rect);

10.CGRectとNSValueの変換
NSArrayでは、NSDictionaryコンテナにはObjetive-Cオブジェクトしか格納できず、C構造体を直接格納することはできません.矩形を格納する必要がある場合は、NSValue値に変換する必要があります.
CGRect rect = CGRectMake(0, 0, 100, 200);
NSValue *value = [NSValue valueWithCGRect:rect];
CGRect newRect = [value rectValue];