CGPoint,CGSize,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);

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];
复制代码

 

posted @   brave-sailor  阅读(174)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2020-09-07 sleep()和usleep()的使用和区别
2017-09-07 使用 Swift 3.0 操控日期
2017-09-07 Android定时任务
2016-09-07 Android Studio 完美修改应用包名
2015-09-07 android ListView和GridView拖拽移位实现代码
2015-09-07 Android ListView 单条刷新方法实践及原理解析
点击右上角即可分享
微信分享提示