为什么我的视图在更改anchorPoint后设置框架时会移动?

我做了UILabel两个实例,并将它们添加到我的ViewController的视图。 然后我把anchorPoint从0.5改为1.0(x和y)。

接下来,我将uiLabel2的框架重置为其创build的框架(100,100,100,20)。

当我运行应用程序时, uiLabel1uiLabel2显示在不同的位置。 为什么?

 UILabel *uiLabel1 = [[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)] autorelease]; uiLabel1.text = @"UILabel1"; uiLabel1.layer.anchorPoint = CGPointMake(1, 1); UILabel *uiLabel2 = [[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)] autorelease]; uiLabel2.text = @"UILabel2"; uiLabel2.layer.anchorPoint = CGPointMake(1, 1); uiLabel2.frame = CGRectMake(100, 100, 100, 20); [self.view addSubview:uiLabel1]; [self.view addSubview:uiLabel2]; 

在这里输入图像说明

一个CALayer有四个属性决定它在超级层中的出现位置:

  • position (与视图的center属性相同)
  • (实际上只是boundssize部分)
  • anchorPoint
  • transform

你会注意到frame 不是这些属性之一。 frame属性实际上是从这些属性派生的。 设置frame属性时,图层实际上会根据您提供的框架和图层的现有anchorPoint更改其centerbounds.size

你创build第一层(通过创build第一个UILabel ,这是UIView一个子类,每个UIView都有一个图层),给它一个100,100,100,20的帧。 该图层具有0.5,0.5的默认锚点。 所以它计算的范围为0,0,100,20,其位置为150,110。 它看起来像这样:

在中心的锚点

然后你改变它的锚点为1,1。 由于您不直接更改图层的位置或边界,而且您也不会通过设置其框架间接更改它们,因此图层会移动,以便其新的锚点位于其超级图层中的(不变的)位置:

在角落锚点

如果你现在要求图层(或视图)的框架,你会得到50,90,100,20。

当您创build第二层(对于第二个UILabel )时,在更改其锚点后,您将设置其框架。 因此,图层根据您提供的框架及其现有的锚点计算新的位置和边界:

锚定在与重置框架的角落

如果你现在要求图层(或视图)的帧,你会得到你设置的帧,100,100,100,20。 但是,如果你要求它的位置(或视图的中心),你将得到200,120。

那么这正是一个锚点。 在更改定位点之前,您正在根据标签的中心设置框架。 之后,您将根据右下angular设置框架。

既然你只是重新设定一个标签的框架,一个基于新的锚点调整其框架,另一个停留在旧的位置。

如果你想让它们在同一个点上,那么你需要在编辑定位点之后为它们重新设置框架,或者根本不要定位。

本指南解释更多关于定位点。