Вычтите CGRect из CGRect - самый большой кусок одного, не содержащий другого - PullRequest
15 голосов
/ 27 января 2011

Как я могу вычесть одно CGRect из другого? Я хочу, чтобы результат R1 - R2 был самым большим под прямоугольником 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 ]

20 голосов
/ 27 января 2011

Ваше определение довольно неоднозначно, что говорит о том, является ли вычитание горизонтальным или вертикальным? Я рекомендую использовать комбинацию 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 голос
/ 27 января 2011
CGRect newRect = CGRectMake(0, 0, rect2.size.width - rect1.size.width, rect2.size.height - rect1.size.height);

В ответ на вашу иллюстрацию этот код, который я вам здесь дал, будет делать именно то, что вы хотите (при условии, что вас не волнуют исходные координаты XY). Я просмотрел документы для функций CGGeometry , и, похоже, CGRectDifference или другой такой метод не определены. Есть, однако, CGRectUnion, но это противоположно тому, что вы ищете.

0 голосов
/ 27 января 2011

Возможно, будет что-то вроде этого:

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