16

我怎样才能CGRect从另一个中减去一个?我希望结果R1 - R2是不与 R2 相交的 R1 的最大子矩形。

示例 1

+---------------------------------+
| +--------+ |
| | R2 | |
| | | |
| +--------+ R1 |
| |
| |
| |
+---------------------------------+

R3 = CGRectSubstract(R2,R1);

            +------------------------+
            | |
            | |
            | |
            | R3 |
            | |
            | |
            | |
            +------------------------+

示例 2

+------------------------+----------+
| | |
| | R2 |
| | |
| R1 +----------+
| |
| |
| |
+---------------------------------+

R3 = CGRectSubstract(R2,R1);

+------------------------+
| |
| |
| |
| R3 |
| |
| |
| |
+------------------------+

示例 3

+---------------------------------+
| |
| |
| |
| R1 |
| +---------+ |
| | | |
| | R2 | |
+---------+---------+--------------+

R3 = CGRectSubstract(R2,R1);

+---------------------------------+
| |
| |
| R3 |
| |
+---------------------------------+



4

3 回答 3

20

您的定义相当模糊,减法是水平的还是垂直的?我建议使用 CGRectIntersection 和 CGRectDivide 的组合,同时指定一个方向来消除歧义。

(未经测试,甚至未编译)

CGRect rectSubtract(CGRect r1, CGRect r2, CGRectEdge edge) {
    // Find how much r1 overlaps r2
    CGRect intersection = CGRectIntersection(r1, r2);

    // If they don't intersect, just return r1. No subtraction to be done
    if (CGRectIsNull(intersection)) {
        return r1;
    }

    // Figure out how much we chop off r1
    float chopAmount = (edge == CGRectMinXEdge || edge == CGRectMaxXEdge)
                       ? intersection.size.width
                       : intersection.size.height;

    CGRect r3, throwaway;
    // Chop
    CGRectDivide(r1, &throwaway, &r3, chopAmount, edge);
    return r3;
}
于 2011-01-27T00:58:39.163 回答
1
CGRect newRect = CGRectMake(0, 0, rect2.size.width - rect1.size.width, rect2.size.height - rect1.size.height);

根据您的说明,我在这里给您的这段代码将完全按照您的要求进行(假设您不关心原点 XY 坐标)。我查看了 CGGeometry functions的文档,似乎没有CGRectDifference定义一个或其他这样的方法。但是,有CGRectUnion, 但这与您正在寻找的相反。

于 2011-01-27T00:10:09.570 回答
-1

可能会是这样的:

CGRect frame = CGRectMake(0, 0, 320, 480);
float aWidth  = frame.size.width; /* say for instance 320 */
float aHeight = frame.size.height; /* say for instance 480 */

int final = aWidth - aHeight;
NSLog(@"Should be -160, your answer: %i",final);
于 2011-01-27T00:15:40.467 回答