Subtract CGRect from CGRect -- largest piece of one not containing the other
How I can substract one CGRect
from another? I want the result R1 - R2
to be the largest subrectangle of R1 that does not intersect R2.
Example 1:
+----------------------------------+ | +--------+ | | | R2 | | | | | | | +--------+ R1 | | | | | | | +----------------------------------+
R3 = CGRectSubstract(R2,R1);
+----------------------+ | | | | | | | R3 | | | | | | | +----------------------+
Example 2:
+-----------------------+----------+ | | | | | R2 | | | | | R1 +----------+ | | | | | | +----------------------------------+
R3 = CGRectSubstract(R2,R1);
+-----------------------+ | | | | | | | R3 | | | | | | | +-----------------------+
Example 3:
+--------------------开发者_运维知识库--------------+ | | | | | | | R1 | | +---------+ | | | | | | | R2 | | +---------+---------+--------------+
R3 = CGRectSubstract(R2,R1);
+----------------------------------+ | | | | | R3 | | | +----------------------------------+
Your definition is fairly ambiguous, what says whether the subtraction is horizontal or vertical? I recommend using a combination of CGRectIntersection and CGRectDivide, along with specifying a direction to remove ambiguity.
(not tested, or even compiled)
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;
}
CGRect newRect = CGRectMake(0, 0, rect2.size.width - rect1.size.width, rect2.size.height - rect1.size.height);
In response to your illustration, this code I've given you here will do exactly what you want (assuming you don't care about the origin XY coordinates). I've looked through the docs for CGGeometry functions, and there doesn't seem to be a CGRectDifference
or other such method defined. There is, however, CGRectUnion
, but that does the opposite of what you are looking for.
Would probably go something like this:
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);
精彩评论