はじめに
位置やサイズ、領域操作系のCGGeometryって便利だなと思って分かるところだけ簡単に調べてみました。
間違いがありましたらご指摘ください。
関数
CGSizeEqualToSize
bool CGSizeEqualToSize (CGSize size1, CGSize size2);
指定した2サイズが等しいか判定する。
CGSize size1 = CGSizeMake(100, 100);
CGSize size2 = CGSizeMake(100, 100);
NSLog(@"result:%@", CGSizeEqualToSize(size1, size2) ? @"同じ" : @"違う");
result:同じ
CGRectContainsPoint
bool CGRectContainsPoint (CGRect rect, CGPoint point);
第2引数で指定した位置が第1引数で指定した領域内か判定する。
CGRect rect = CGRectMake(30, 50, 100, 100);
CGPoint point = CGPointMake(80, 140);
NSLog(@"result:%@", CGRectContainsPoint(rect, point)? @"領域内" : @"領域外");
result:領域内
CGRectContainsRect
bool CGRectContainsRect (CGRect rect1, CGRect rect2);
第1引数の領域内に第2引数の領域が含まれるか判定。
BOOL result1 = CGRectContainsRect(CGRectMake(30, 30, 100, 100), CGRectMake(40, 40, 30, 30));
NSLog(@"result1:%@", result1 ? @"含まれる" : @"含まれない");
BOOL result2 = CGRectContainsRect(CGRectMake(30, 30, 100, 100), CGRectMake(60, 60, 100, 100));
NSLog(@"result2:%@", result2 ? @"含まれる" : @"含まれない");
result1:含まれる
result2:含まれない
CGRectDivide
void CGRectDivide (
CGRect rect,
CGRect *slice,
CGRect *remainder,
CGFloat amount,
CGRectEdge edge
);
第1引数の領域を指定方向、指定サイズで分割する。
CGRectEdgeはCGRectMinXEdge,CGRectMaxXEdge,CGRectMinYEdge,CGRectMaxYEdgeの4種類。
CGFloat amount = 50.0f;
CGRect rect = self.view.frame;
CGRect sliceRect = CGRectNull;
CGRect remainderRect = CGRectNull;
CGRectDivide(rect, &sliceRect, &remainderRect, amount, CGRectMinXEdge);
NSLog(@"rect:%@", NSStringFromCGRect(rect)); //rect:{{0, 0}, {320, 568}}
NSLog(@"sliceRect:%@", NSStringFromCGRect(sliceRect)); //sliceRect:{{0, 0}, {50, 568}}
NSLog(@"remainderRect:%@", NSStringFromCGRect(remainderRect)); //remainderRect:{{50, 0}, {270, 568}}
UIView *sliceView = [[UIView alloc] initWithFrame:sliceRect];
sliceView.backgroundColor = [UIColor redColor];
[self.view addSubview:sliceView];
UIView *remainderView = [[UIView alloc] initWithFrame:remainderRect];
remainderView.backgroundColor = [UIColor blueColor];
[self.view addSubview:remainderView];
CGFloat amount = 50.0f;
CGRect rect = self.view.frame;
CGRect sliceRect = CGRectNull;
CGRect remainderRect = CGRectNull;
CGRectDivide(rect, &sliceRect, &remainderRect, amount, CGRectMaxXEdge);
NSLog(@"rect:%@", NSStringFromCGRect(rect)); //rect:{{0, 0}, {320, 568}}
NSLog(@"sliceRect:%@", NSStringFromCGRect(sliceRect)); //sliceRect:{{270, 0}, {50, 568}}
NSLog(@"remainderRect:%@", NSStringFromCGRect(remainderRect)); //remainderRect:{{0, 0}, {270, 568}}
UIView *sliceView = [[UIView alloc] initWithFrame:sliceRect];
sliceView.backgroundColor = [UIColor redColor];
[self.view addSubview:sliceView];
UIView *remainderView = [[UIView alloc] initWithFrame:remainderRect];
remainderView.backgroundColor = [UIColor blueColor];
[self.view addSubview:remainderView];
CGFloat amount = 50.0f;
CGRect rect = self.view.frame;
CGRect sliceRect = CGRectNull;
CGRect remainderRect = CGRectNull;
CGRectDivide(rect, &sliceRect, &remainderRect, amount, CGRectMinYEdge);
NSLog(@"rect:%@", NSStringFromCGRect(rect)); //rect:{{0, 0}, {320, 568}}
NSLog(@"sliceRect:%@", NSStringFromCGRect(sliceRect)); //sliceRect:{{0, 518}, {320, 50}}
NSLog(@"remainderRect:%@", NSStringFromCGRect(remainderRect)); //remainderRect:{{0, 0}, {320, 518}}
UIView *sliceView = [[UIView alloc] initWithFrame:sliceRect];
sliceView.backgroundColor = [UIColor redColor];
[self.view addSubview:sliceView];
UIView *remainderView = [[UIView alloc] initWithFrame:remainderRect];
remainderView.backgroundColor = [UIColor blueColor];
[self.view addSubview:remainderView];
CGFloat amount = 50.0f;
CGRect rect = self.view.frame;
CGRect sliceRect = CGRectNull;
CGRect remainderRect = CGRectNull;
CGRectDivide(rect, &sliceRect, &remainderRect, amount, CGRectMaxYEdge);
NSLog(@"rect:%@", NSStringFromCGRect(rect)); //rect:{{0, 0}, {320, 568}}
NSLog(@"sliceRect:%@", NSStringFromCGRect(sliceRect)); //sliceRect:{{0, 518}, {320, 50}}
NSLog(@"remainderRect:%@", NSStringFromCGRect(remainderRect)); //remainderRect:{{0, 0}, {320, 518}}
UIView *sliceView = [[UIView alloc] initWithFrame:sliceRect];
sliceView.backgroundColor = [UIColor redColor];
[self.view addSubview:sliceView];
UIView *remainderView = [[UIView alloc] initWithFrame:remainderRect];
remainderView.backgroundColor = [UIColor blueColor];
[self.view addSubview:remainderView];
CGRectEqualToRect
bool CGRectEqualToRect (CGRect rect1, CGRect rect2);
2領域の位置とサイズが等しいか判定する。
NSLog(@"result:%@", CGRectEqualToRect(CGRectMake(0, 0, 10, 10), CGRectMake(0, 0, 10, 10)) ? @"同じ" : @"違う");
result:同じ
CGRectGetWidth
CGFloat CGRectGetWidth (CGRect rect);
指定した領域の幅を返す。
UIView *rectView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 30, 100)];
NSLog(@"GetWidth:%f", CGRectGetWidth(rectView.frame));
GetWidth:30.000000
CGRectGetHeight
CGFloat CGRectGetHeight (CGRect rect);
指定した領域の高さを返す。
UIView *rectView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 30, 100)];
NSLog(@"GetHeight:%f", CGRectGetHeight(rectView.frame));
GetHeight:100.000000
CGRectGetMinX
CGFloat CGRectGetMinX (CGRect rect);
指定した領域の最小x座標を返す。
UIView *rectView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 30, 100)];
NSLog(@"minX:%f", CGRectGetMinX(rectView.frame));
minX:10.000000
CGRectGetMidX
CGFloat CGRectGetMidX (CGRect rect);
指定した領域の中心x座標を返す。
UIView *rectView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 30, 100)];
NSLog(@"midX:%f", CGRectGetMidX(rectView.frame));
midX:25.000000
CGRectGetMaxX
CGFloat CGRectGetMaxX (CGRect rect);
指定した領域の最大x座標を返す。
UIView *rectView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 30, 100)];
NSLog(@"maxX:%f", CGRectGetMaxX(rectView.frame));
maxX:40.000000
CGRectGetMinY
CGFloat CGRectGetMinY (CGRect rect);
指定した領域の最小y座標を返す。
UIView *rectView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 30, 100)];
NSLog(@"minY:%f", CGRectGetMinY(rectView.frame));
minY:10.000000
CGRectGetMidY
CGFloat CGRectGetMidY (CGRect rect);
指定した領域の中心y座標を返す。
UIView *rectView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 30, 100)];
NSLog(@"midY:%f", CGRectGetMidY(rectView.frame));
midY:60.000000
CGRectGetMaxY
CGFloat CGRectGetMaxY (CGRect rect);
指定した領域の最大y座標を返す。
UIView *rectView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 30, 100)];
NSLog(@"maxY:%f", CGRectGetMaxY(rectView.frame));
maxY:110.000000
CGRectInset
CGRect CGRectInset (
CGRect rect,
CGFloat dx,
CGFloat dy
);
指定した領域のdx,dy分内側の領域を返す。
self.view.backgroundColor = [UIColor yellowColor];
CGRect insetRect = CGRectInset(self.view.frame, 30, 30);
NSLog(@"insetRect:%@", NSStringFromCGRect(insetRect)); // insetRect:{{30, 30}, {260, 508}}
UIView *insetView = [[UIView alloc] initWithFrame:insetRect];
insetView.backgroundColor = [UIColor redColor];
[self.view addSubview:insetView];
CGRectIntegral
CGRect CGRectIntegral (CGRect rect);
指定した領域の座標xの小数点以下を幅(width)に足して繰り上げ、座標yの小数点以下を高さ(height)に足して繰り上げした領域を返す。
CGRect integralRect = CGRectMake(10.9, 20.9, 100.5, 200.3);
NSLog(@"CGRectIntegral:%@", NSStringFromCGRect(CGRectIntegral(integralRect)));
CGRect integralRect2 = CGRectMake(10.2, 20.5, 100.5, 200.3);
NSLog(@"CGRectIntegral2:%@", NSStringFromCGRect(CGRectIntegral(integralRect2)));
CGRectIntegral:{{10, 20}, {102, 202}}
CGRectIntegral2:{{10, 20}, {101, 201}}
CGRectIntersection
CGRect CGRectIntersection (CGRect r1, CGRect r2);
2つの領域の重なっている箇所の領域を返す。
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
view1.backgroundColor = [UIColor yellowColor];
[self.view addSubview:view1];
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(80, 150, 200, 200)];
view2.backgroundColor = [UIColor blueColor];
[self.view addSubview:view2];
CGRect intersectionRect = CGRectIntersection(view1.frame, view2.frame);
NSLog(@"intersectionRect:%@", NSStringFromCGRect(intersectionRect)); //intersectionRect:{{80, 150}, {170, 150}}
UIView *intersectionView = [[UIView alloc] initWithFrame:intersectionRect];
intersectionView.backgroundColor = [UIColor redColor];
[self.view addSubview:intersectionView];
CGRectIntersectsRect
bool CGRectIntersectsRect (CGRect rect1, CGRect rect2);
2つの領域が重なり合うか判定する。
CGRect rect1 = CGRectMake(50, 50, 100, 100);
CGRect rect2 = CGRectMake(100, 100, 50, 30);
NSLog(@"result1:%@", CGRectIntersectsRect(rect1, rect2) ? @"重なる" : @"重ならない");
CGRect rect3 = CGRectMake(50, 50, 100, 100);
CGRect rect4 = CGRectMake(200, 200, 50, 30);
NSLog(@"result2:%@", CGRectIntersectsRect(rect3, rect4) ? @"重なる" : @"重ならない");
result1:重なる
result2:重ならない
CGRectIsEmpty
bool CGRectIsEmpty (CGRect rect);
幅か高さが0、もしくはCGRectNullか判定する。
NSLog(@"result1:%@", CGRectIsEmpty(CGRectMake(10, 10, 0, 100)) ? @"Empty" : @"Rectangle");
NSLog(@"result2:%@", CGRectIsEmpty(CGRectMake(10, 10, 10, 0)) ? @"Empty" : @"Rectangle");
NSLog(@"result3:%@", CGRectIsEmpty(CGRectNull) ? @"Empty" : @"Rectangle");
NSLog(@"result4:%@", CGRectIsEmpty(CGRectMake(10, 10, 10, 10)) ? @"Empty" : @"Rectangle");
result1:Empty
result2:Empty
result3:Empty
result4:Rectangle
CGRectIsInfinite
bool CGRectIsInfinite (CGRect rect);
指定領域が無限か判定する。
CGRect infiniteRect = CGRectInfinite;
NSLog(@"result1:%@", CGRectIsInfinite(infiniteRect) ? @"無限" : @"無限じゃない");
NSLog(@"result2:%@", CGRectIsInfinite(CGRectMake(10, 10, 10, 10)) ? @"無限" : @"無限じゃない");
NSLog(@"result3:%@", CGRectIsInfinite(CGRectMake(0, 0, 0, 0)) ? @"無限" : @"無限じゃない");
result1:無限
result2:無限じゃない
result3:無限じゃない
CGRectIsNull
bool CGRectIsNull (CGRect rect);
指定領域がNULLか判定する。
CGRect rectNull = CGRectNull;
NSLog(@"result1:%@", CGRectIsNull(rectNull) ? @"CGRectNull" : @"CGRectNullじゃない");
NSLog(@"result2:%@", CGRectIsNull(CGRectMake(0, 0, 10, 10)) ? @"CGRectNull" : @"CGRectNullじゃない");
result1:CGRectNull
result2:CGRectNullじゃない
CGRectOffset
CGRect CGRectOffset (
CGRect rect,
CGFloat dx,
CGFloat dy
);
指定領域の座標xにdxを加算、座標yにdyを加算した領域を返す。
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(10, 20, 150, 150)];
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1];
CGRect offsetRect = CGRectOffset(view1.frame, 150, 150);
NSLog(@"offsetRect:%@", NSStringFromCGRect(offsetRect)); //offsetRect:{{160, 170}, {150, 150}}
UIView *offsetRectView = [[UIView alloc] initWithFrame:offsetRect];
offsetRectView.backgroundColor = [UIColor blueColor];
[self.view addSubview:offsetRectView];
CGRectStandardize
CGRect CGRectStandardize (CGRect rect);
指定領域の幅と高さが正の値となる領域を返す。
CGRect standardizeRect = CGRectStandardize(CGRectMake(0, 0, -100, -50));
NSLog(@"standardizeRect:%@", NSStringFromCGRect(standardizeRect));
standardizeRect:{{-100, -50}, {100, 50}}
CGRectUnion
CGRect CGRectUnion (CGRect r1, CGRect r2);
指定した2領域を覆う領域を返す。
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(40, 50, 180, 180)];
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1];
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(70, 90, 180, 200)];
view2.backgroundColor = [UIColor yellowColor];
[self.view addSubview:view2];
CGRect unionRect = CGRectUnion(view1.frame, view2.frame);
NSLog(@"unionRect:%@", NSStringFromCGRect(unionRect));
UIView *unionView = [[UIView alloc] initWithFrame:unionRect];
unionView.backgroundColor = [UIColor clearColor];
unionView.layer.borderColor = [[UIColor blackColor] CGColor];
unionView.layer.borderWidth = 1.0;
[self.view addSubview:unionView];