美文网首页
ios - CGPoint,CGSize,CGRect简介

ios - CGPoint,CGSize,CGRect简介

作者: cain07 | 来源:发表于2023-10-11 14:40 被阅读0次

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

    5.1 分割矩形

    参数rect是源矩形,slice和remainder是分割后的两部分矩形,amount是分割线,edge是分割选项。

    注意:1、edge是一个宏,定义了分割的方式如下:

    void CGRectDivide(CGRect rect, CGRect *slice, CGRect *remainder,
    
      CGFloat amount, CGRectEdge edge);
      typedef  
             CF_ENUM(uint32_t, CGRectEdge) { 
             //从x的最小处进行垂直分割 
             CGRectMinXEdge,  
             //从y的最小处进行水平分割  
             CGRectMinYEdge,  
             //从x最大处进行垂直分割 
             CGRectMaxXEdge, 
             //从y最大处进行水平分割 
             CGRectMaxYEdge 
             }; 
    

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

    相关文章

      网友评论

          本文标题:ios - CGPoint,CGSize,CGRect简介

          本文链接:https://www.haomeiwen.com/subject/iujgbdtx.html