CGRect用法详解

在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,0).
  • 空矩形 CGRectNull;取两个不相交矩形的相交区域会返回CGRectNull,一个矩形与CGRectNull的并集为原矩形。使用CGRectIsNull判断一个矩形是否为CGRectNull。CGRectIsEmpty对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);
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. 检查两矩形是否相交

CGRect playerRect = CCRectMake(200, 300, 10, 10);
CGRect mineRect = CGRectMake(10, 10, 20, 20);
if (CGRectIntersectsRect(playerRect, mineRect)) {
    // YES!
}

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);

11. CGRect与NSValue转换

在NSArray,NSDictionary容器中只能存储Objetive-C对象,不能直接存储C结构体,所有需要存储矩形时,需要将其转换为NSValue值。

CGRect rect = CGRectMake(0, 0, 100, 200);
NSValue *value = [NSValue valueWithCGRect:rect];
CGRect newRect = [value rectValue];

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值