【问题标题】:Calculating new origin of insetted CGRect after its size changes在其大小更改后计算插入的 CGRect 的新原点
【发布时间】:2012-08-09 08:39:51
【问题描述】:

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

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

更新:实际上,这行不通...尝试想出一种方法,使我能够在两个视图的大小成比例增加后正确地将视图定位在另一个视图中。

【问题讨论】:

  • 如果您不想回答您的问题,请不要将它们放在 stackoverflow 上。重现问题、提出解决方案并在此处发布需要时间。
  • @AndreasLey - 感谢您抽出宝贵时间写出答案,但在我所问的两件事中,您的回答都不正确,即 1)如果乘以与尺寸增加的比例相同,您说“是的,您提出的建议有效”。然后我问文档中是否有一种方法可以将矩形的所有值相乘,你手动为我写了一些,这很酷,但它很简单,我可以自己完成。只是好奇苹果图书馆里有没有。
  • 您的问题含糊不清。我为您的问题的原始版本和更新版本提供了正确的解决方案。仅仅因为它不是你所期望的并不意味着它是不正确的。另外,请记住,stackoverflow 被其他人使用,他们将通过 Google 找到此页面。他们也想知道提议的解决方案是否有效。
  • @andreasley - 即使在你的更新中,你仍然不明白我在问什么。我问插入矩形的原点是否按比例增长,因为它和初始矩形都按比例增加。那是我的第一个问题,您回答错误。现在你为我提供了一种我什至没有要求的方法,我知道如何在另一个形状中居中。是的,我确实了解其他人通过 Google 使用 stackoverflow,这正是我将您的答案标记为不正确的原因。你没有回答我的任何一个问题。没有什么私人的。
  • 唯一回答你问题的人显然不明白,你不觉得有点奇怪吗?此外,您的更新表明您正在寻找一种“在两个视图的大小成比例增加后正确定位另一个视图中的视图”的方法,为此我清楚地为您提供了一个可行的解决方案。

标签: iphone ios cocoa-touch math geometry


【解决方案1】:

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

如果同时使用多个原点和大小,会发生以下情况:

如果你不乘以外部矩形的原点,就会发生这种情况:

从您的问题来看,您要达到的目标并不完全清楚。 如果您想放大 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);

但是,在处理CGRects 时,通常是关于UIViews。如果您想在其父视图中居中 UIView,请执行以下操作:

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

如果内部视图与外部视图具有相同的父视图,您可以简单地将其置于外部视图的中心:

innerView.center = outerView.center;

【讨论】:

  • 为自己的代码使用 CoreGraphics 前缀可能不是一个好主意。
  • @Paul.s 是的,先生。谢谢。 :)
  • @Abizern 在这种情况下,内联函数的优势是什么?
  • 你的#define 让它看起来像是一个正在使用的函数,而实际上它是替换的。如果人们将它们用作函数,这可能会导致问题。
  • 对不起...我应该说考虑添加您自己的前缀,例如ALRectCenterInRect
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
相关资源
最近更新 更多