在大小改变后计算插入的CGRect的新原点

时间:2012-08-09 08:39:51

标签: iphone ios cocoa-touch math geometry

我有CGRect ACGRect B其中B位于A内(CGRect包含x和y原点以及高度和宽度大小一个矩形)。如果我将A的宽度和高度增加一定比例,并将B的宽度和高度增加相同的比例,则会将B的x原点与y原点相乘B按相同的比例(对于宽度和高度而言)B是否会A保持在CGRect的中心,因为两者都按新比例增长?我已经在几个不同的场景中对此进行了测试,但它确实有效,但只是想验证它是否适用于所有情况,因为我的数学并不那么尖锐。

另外,想知道是否有一种方法可以让您将{{1}}的所有值乘以此比例,而无需手动执行(在文档中找不到)。

更新:实际上,这不起作用......试图想出一种方法,可以让我在两者的大小成比例增加之后正确地将视图定位在另一个视图中。

1 个答案:

答案 0 :(得分:2)

是的,你提出的建议有效,但前提是外CGRect的原点是0,0,或者你的原点乘以因子。如果不这样做,内部矩形将移动到右下角。

如果你的原点和大小都是多重的话会发生什么:

center CGRect in CGRect

如果你没有乘以外部rect的原点,就会发生这种情况:

enter image description here

从你的问题来看,你想要实现的目标并不完全清楚。 如果您想要放大CGRect并将其重新设置为另一个,请使用以下函数:

//  center a CGRect in another one
static inline CGRect ALRectCenterInRect(CGRect outerRect, CGRect innerRect)
{
    return CGRectMake(CGRectGetMidX(outerRect)-innerRect.size.width/2, CGRectGetMidY(outerRect)-innerRect.size.height/2, innerRect.size.width, innerRect.size.height);
}

//  multiply each value of a CGRect with factor
//      combine with CGRectIntegral() to prevent fractions (and the resulting aliasing)
static inline CGRect ALRectMultiply(CGRect rect, CGFloat factor)
{
    return CGRectMake(rect.origin.x*factor, rect.origin.y*factor, rect.size.width*factor, rect.size.height*factor);
}

如何使用它们:

CGRect centeredInnerRect = ALRectCenterInRect(outerRect, innerRect);

CGRect multipliedRect = ALRectMultiply(someRect, 1.5);

但是,在处理CGRect时,通常约为UIView秒。如果您想在其超级视图中居中UIView,请执行以下操作:

someSubview.center = CGPointMake(CGRectGetMidX(someSuperview.bounds), CGRectGetMidY(someSuperview.bounds));

如果内部视图与外部视图具有相同的超视图,则可以将其简单地放在外部视图中:

innerView.center = outerView.center;