CGRect使用技巧
来源:互联网 发布:mac远程协助windows 编辑:程序博客网 时间:2024/05/21 09:35
在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);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.检查两矩形是否相交
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]; // autoreleasedCFRelease(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];
参考:
CGGeometry Reference
CGRect Tricks
Rectangles, Part 1
Rectangles, Part 2
A potential pitfall of CGRectIntegral
- CGRect使用技巧
- CGRect使用技巧
- CGRect使用技巧
- CGRect 的使用
- CGRect
- CGRect
- CGRECT
- CGRect
- Swift-CGRect,CGSize,CGPoint 使用
- - (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs;使用
- - (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs;使用
- iOS开发72-iOS 使用NSStringFromCGRect打印CGRect
- CGRect函数
- cgrect 常用
- 关于CGRect
- [ios] CGRect
- CoreGraphics--CGRect
- 有关CGRect
- Linux内核中的双向循环链表学习
- 第十二周
- PHP_SELF、 SCRIPT_NAME、 REQUEST_URI区别
- 阶乘
- Android Drawable文件分类及内存问题
- CGRect使用技巧
- 各种后缀文件的意思
- 快速找到某台电脑上tomcat的安装路径
- cocos2dx2.2版本之后,如何生成项目工程
- Android列表之圆角ListView
- Robotium API 翻译(四)——等待执行的方法sleep、waitFor
- eclipse默认指向 WebContent 目录 修改为 webRoot
- linux静态库与共享库(二)
- 函数签名