2014-05-21 25 views
1

我有一个框架为(50, 50, 100, 100)的UIView对象。 关于这个视图对象,我正在添加一个标签与框架(50, 50, 50, 10) 然后,我正在改变定位点from default(0.5, 0.5) to (1.0, 0.5) 但令人惊讶的是,框架后来改变。下面是对于相同的UILabel的框架在更改锚点时如何更改

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(rect.origin.x, rect.origin.y, rect.size.width/2, 10)]; 
NSLog(@"Label frame for %d label before anchor point shift is %@", i, NSStringFromCGRect(label.frame)); 

label.layer.anchorPoint = CGPointMake(1.0, 0.5); 
NSLog(@"Label frame for %d label after anchor point shift is %@", i, NSStringFromCGRect(label.frame)); 

代码段,带出输出:锚点移位之前 标签帧为0的标签是{{50,50},{50,10}}之后 标签帧为0标签锚点偏移是{{25,50},{50,10}}

+0

我不明白你的问题/问题 –

+0

@Matteo我的问题是当我更改关联图层的锚点时,UILabel的框架如何移位。 –

回答

2

一个UIViewframe衍生基于所述centerbounds性质量。如果更改centerbounds,则会相应地调整frame。同样,根据需要更改frame可调整center和/或bounds

好吧,这很好,除了你改变图层的anchorPoint。当你改变图层的anchorPoint时,它会改变图层的中心点,这会改变UIView的中心点,然后改变图框。因此,标签移动。

+0

在 –

2

一个CALayer的有确定它出现在其superlayer四个属性: 位置(这是相同视图的中心属性) 范围(实际上只边界的大小一部分) anchorPoint 变换 你会发现该框架不属于这些属性之一。框架属性实际上是从这些属性派生而来的。设置框架属性时,图层实际上会根据您提供的框架和图层现有的anchorPoint更改其中心和bounds.size。

您创建第一层(通过创建第一个UILabel,它是UIView的子类,每个UIView都有一个图层),给它一个50,50,50,10的框架。该图层具有0.5,0.5的默认锚点。所以它计算其范围为0,0,50,10,其位置为75,55。

默认情况下,锚点和位置是重合的。 如果我们将anchorPoint更改为1,0.5,它将改变位置,因此中心也将变为100,55。但不是移动中心/位置,而是移动标签的框架。所以如果我们希望75,55作为新的锚点为1,1,我们将不得不将帧移动-25,0(75,55 - 100,55)。因此框架从控制台输出给出的内容变化。 锚点移动前0标签的标签帧为{{50,50},{50,10}} 锚点移动后0标签的标签帧为{{25,50},{50,10}}

+0

以下作为单独的答案添加了更详细的说明这是一个很好的解释。我故意忽略了一些细节以避免混淆。例如,关于'transform'和'frame'之间关系的完整讨论会变得混乱。 – user3386109

+0

“该图层的默认锚点为0.5,0.5,因此它将其边界计算为0,0,50,10,其位置为75,55。”我根本不理解这个部分。当帧为50,50,50,10时,边界0,0,50,10如何? – CapturedTree