iOS编程离不开对控件,图形,文字等的几何位置的调整, 深入了解并且能方便的操作是最基本的要求.
主要有如下几种基本的数据结构:CGPoint, CGSize, CGRect,CGVector,这些基本的概念不做赘述.
创建这些数据结构:
//创建CGPoint
CGPoint point = CGPointMake(20, 20);
//创建CGSize
CGSize size = CGSizeMake(100, 100);
//创建CGRect
CGRect rect = CGRectMake(20, 20, 100, 100);
//或者通过
CGRect rect = <strong>(CGRect){20,20,100,100};</strong>
如果想看结果如何,可以转换成NSString,直接打印出来验证一下
NSLog(@"point = %@",NSStringFromCGPoint(point)); //转换CGPoint
NSLog(@"size = %@",NSStringFromCGSize(size)); //转换CGSize
NSLog(@"rect = %@",NSStringFromCGRect(rect)); //转换CGRect
有几个系统预定义的几个常量方便使用
CGPointZero:等同于CGPointMake(0, 0)
CGSizeZero:等同于CGSizeMake(100, 100)
CGRectZero:等同于CGRectMake(0, 0, 0, 0)
CGRectNull:并不等于CGRectZero打印出来是{{inf, inf}, {0, 0}},我理解是一个不存在的CGRect
CGRectInfinite:无穷大的一个CGRect
判断是否是以上常量
CGRectIsEmpty(rect) //CGRextZero 和 CGRectNull 是空
CGRectIsNull(rect)
CGRectIsInfinite(rect)
获得CGRect的一些特征点
// minx midx maxx
// miny 1 2 3
// midy 8 9 4
// maxy 7 6 5
CGFloat minX = CGRectGetMinX(rect);//点1的x坐标
CGFloat midX = CGRectGetMidX(rect);//点2的x坐标
CGFloat maxX = CGRectGetMaxX(rect);//点3的x坐标
CGFloat minY = CGRectGetMinY(rect);//点1的y坐标
CGFloat midY = CGRectGetMidY(rect);//点8的y坐标
CGFloat maxY = CGRectGetMaxY(rect);//点7的y坐标
比较数据是否相等
CGPointEqualToPoint(point1,point2);
CGSizeEqualToSize(size1, size2)
CGRectEqualToRect(rect1,rect2);
比较是否包含
CGRectContainsPoint(rect, point) //矩形是否包含点
CGRectContainsRect(rect1, rect2) //矩形是否包含另外一个矩形,必须完全包含才是TRUE
矩形变换
CGRectOffset(rect,dx,dy):将矩形沿x轴偏移dx,沿y轴偏移dy得到新的矩形
CGRect rect = CGRectMake(0, 0, 100, 100);
CGRectOffset(rect, 100, 100); {{100, 100}, {100, 100}}
CGRectIntegral(rect):获得能包含现有矩阵的最小整数矩阵(四个数字都是整数)
CGRect rect = CGRectMake(20.2, 20.7, 20.8, 20.3);
CGRectIntegral(rect); //{{20, 20}, {21, 21}}
CGRectInset(rect, dx, dy):x偏移dx,y偏移dy, size.x减少dx*2,size.y减少dy*2
CGRect rect = (CGRect){20,20,100,100};
CGRectInset(rect, 10, 5); //{{30, 25}, {80, 90}}
CGRectUnion(rect1, rect2):包含两个rect的矩形
CGRect rect1 = CGRectMake(0, 0, 30, 30);
CGRect rect2 = CGRectMake(50, 50, 100, 100);
CGRectUnion(rect1, rect2);//{{0, 0}, {150, 150}}
CGRectIntersectsRect(rect1, rect2):rect1和rect2相交得到的矩形,如果不相交,返回CGRectNull
CGRect rect1 = CGRectMake(0, 0, 30, 30);
CGRect rect2 = CGRectMake(20, 20, 100, 100);
CGRectIntersection(rect1, rect2);//{{20, 20}, {10, 10}}
CGRectDivide(CGRect rect, CGRect *slice, CGRect *remainder,CGFloat amount, CGRectEdge edge)
参数一:被分割的矩形,参数二:被分割成的第一个矩形,参数三:被分割后剩下的矩形,参数四:分割那条边开始计算的长度,参数五:从那条边计算 (CGRectMinXEdge:上面的横边CGRectMinYEdge:左边的竖边CGRectMaxXEdge:下面的横边CGRectMaxYEdge:右边的竖边) 如果长度超过了被分割矩形的长度,那么剩下的矩形的大小为0
CGRect rect1;
CGRect rect2;
CGRectDivide(rect, &rect1, &rect2, 20, CGRectMinXEdge); //rect1 = {{0, 0}, {20, 100}},rect2 = {{20, 0}, {80, 100}}
几何数据和字典相互转换
CGPointCreateDictionaryRepresentation(CGPointMake(10, 10)); //{X = 10;Y = 10;}
CGSizeCreateDictionaryRepresentation(CGSizeMake(10, 10)); //{Height = 10;Width = 10;}
CGRectCreateDictionaryRepresentation(CGRectMake(10, 10, 10, 10)); //{Height = 10;Width = 10;X = 10;Y = 10;}
NSDictionary *dic = @{@"Height":@10,@"Width":@10,@"X":@10,@"Y":@10};
CGRect rect;
CGRectMakeWithDictionaryRepresentation((CFDictionaryRef)dic, &rect);