CGRectの使い方
3948 ワード
iOS開発では、点、サイズ、矩形の処理がしばしば必要であり、対応するデータ構造はそれぞれCGPoint、CGSize、CGRectであり、これらのデータ構造はC構造体であり、定義はそれぞれ以下の通りである.
これらのデータ構造を操作するには、以下のように簡単な方法があります.
1.CGPoint,CGSize,CGRectの作成
いくつかの特殊な情況の零点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.二つの点、大きさ、矩形が等しいかどうかを判断する
CGPoint,CGSize,CGRectの内部データはいずれもCGPointであり,浮動小数点数については切り込み誤差がある可能性があるため,両者が等しいか否かを直接判断することはできず,両値の差が十分小さいか否かを判断すべきである.上記の方法を用いると,これらの判断を手作業で行うことを回避し,コードを簡略化することができる.
3.長方形の境界、中点座標値、縦横を取得
境界座標値、すなわちx,yの最大値と最小値を取得します.
中点座標値、すなわちx,yの中点を取得する
長方形の長さ、幅を取得
4.対称インデントCGRect
5.非対称インデントCGRect
6.小数画素CGRectを整数画素に調整
origin値を最近接整数に下方修正する、sizeを最近接整数に上方修正することで、生成されたCGRectが元のCGRectを完全に含むことができる.
7.長方形に点が含まれているかどうかを確認する
8.2つの長方形が交差しているかどうかを確認する
9.CGRectとNSStringの変換
10.CGRectとNSDictionary変換
10.CGRectとNSValueの変換
NSArrayでは、NSDictionaryコンテナにはObjetive-Cオブジェクトしか格納できず、C構造体を直接格納することはできません.矩形を格納する必要がある場合は、NSValue値に変換する必要があります.
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];