如何从另一个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 | | | +----------------------------------+
答案 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);