ios几何数据结构:CGGeometry,CGPoint,CGSize,CGRect,CGRectInset,CGRectOffset,CGRectDivide

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值