从CGRect中减去CGRect - 最大的一个不包含另一个

时间:2011-01-27 00:05:16

标签: objective-c geometry core-graphics cgrect

如何从另一个CGRect中减去一个R1 - R2?我希望结果{{1}}是R1的最大子矩形,不与R2相交。

示例1

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

R3 = CGRectSubstract(R2,R1);

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

示例2

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

R3 = CGRectSubstract(R2,R1);

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

示例3

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

R3 = CGRectSubstract(R2,R1);

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



3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

CGRect newRect = CGRectMake(0, 0, rect2.size.width - rect1.size.width, rect2.size.height - rect1.size.height);

为了回应你的插图,我在这里给你的这段代码将完全符合你的要求(假设你不关心原点XY坐标)。我查看了docs for CGGeometry functions,似乎没有定义CGRectDifference或其他此类方法。但是,有CGRectUnion,但这与您正在寻找的相反。

答案 2 :(得分:0)

可能会是这样的:

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