在CGAffineTransform之后获取UIView的中心

3
假设我有一个小的UIView作为较大的UIView的子视图,并且该子视图可以通过一些CGAffineTransforms进行移动。那么父视图如何知道该视图在其自己的坐标系中的真实“中心”位置?我尝试使用convertPoint例程和child.center返回的任何内容,但它不起作用...在这种情况下,“center”完全是虚假的,还是我只是使用了错误的方法?

我不知道在存在CGAffineTransforms的情况下center的行为如何,但是你不应该使用convertPoint,因为据说center是“在其父视图的坐标系中”。(或者我可能误解了你所说的“自己的”含义。) - Phillip Mills
请给出您正在使用的代码和看到的值的一些示例。 “不起作用”对任何人都没有帮助。 - jrturton
1个回答

6

编辑:

经过一些测试,我注意到以下内容:

UIViews没有anchorPoint属性,但它们有一个center属性。中心属性在应用变换后总是正确计算的,除了平移变换,对于这种情况,你需要执行以下操作:

CGPoint realCenter = CGPointMake(myView.center.x + myView.frame.origin.x, ...);

CALayer 而言,它们确实有一个 anchorPoint 属性,但它们缺少 center 属性。因此,你需要通过对位置属性、anchorPoint 属性以及图层的转换进行计算来手动计算中心。
由于我不确定您使用的是哪种方法,因此无法提供任何代码。总之,你需要自己编写中心计算器。
请仔细查看下面的图片(来源于 Stanford iPhone Development 课程幻灯片):
在应用任何旋转之前:
经过 45° 旋转后:
结论:
请注意旧中心点为 (300, 225),新中心点实际上并没有改变,还是原来的位置。如果您想计算视图中的另一个点,则必须自行计算。同时请注意,框架从 (200, 100, 200, 250) 变成了 (140, 65, 320, 320)。这就是 UIKit 的魔法。

然而,如果变换是平移或缩放并具有不同的锚点,则视图的中心将不同(在屏幕上)。 - Jonathan.
@Jonathan。是的,它应该像上面的示例一样正确计算。如果您得到不同的结果,请告诉我。 - Mazyod
@Jonathan。顺便问一下,你是否在使用CALayer?我不熟悉UIView有锚点的情况。 - Mazyod
哦,对不起我误解了,我以为你的意思是中心点的值不应该改变,因为你的答案说中心点“不是新的”,但在某些情况下它将是新的。如果您更改视图层的anchorPoint,则会影响您应用的变换。(因为UIView的变换和中心点只是视图层上的包装方法) - Jonathan.
@Jonathan。哦,好吧,那么你就得自己编写代码并根据需要计算东西了。 - Mazyod
1
谢谢你!在我的脑海中,我认为中心理论上应该是相同的,但我也发誓在某个地方读到过,一旦我们应用变换,就不能再使用普通的框架矩形来做任何事情(好像它变得未定义)。我一直在应用平移,所以我已经按照你建议的手动计算了中心点,现在它运行得非常好,谢谢 :) - Kieran Harper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接