10

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

接下来,我将框架重置为uiLabel2我创建它的框架:(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];

在此处输入图像描述

4

2 回答 2

47

ACALayer有四个属性来确定它在其超层中的出现位置:

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

您会注意到这不是frame这些属性之一。该属性实际上是从这些属性派生的。设置属性时,图层实际上会根据您提供的框架和图层的现有.frameframecenterbounds.sizeanchorPoint

您创建第一层(通过创建第一个UILabel,它是 的子类UIView,并且每个UIView都有一个层),给它一个 100,100,100,20 的框架。该图层的默认锚点为 0.5,0.5。因此,它将其边界计算为 0,0,100,20,将其位置计算为 150,110。它看起来像这样:

锚在中心

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

锚在角落

如果您现在要求图层(或视图)的框架,您将获得 50,90,100,20。

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

用重置框架锚定角落

如果您现在向图层(或视图)询问其框架,您将获得您设置的框架,100,100,100,20。但是如果你问它的位置(或视图的中心),你会得到 200,120。

于 2012-08-31T03:39:09.377 回答
4

这正是锚点的作用。在更改锚点之前,您根据标签的中心设置框架。之后,您将根据右下角设置框架。

由于您只为一个标签重置框架,一个基于新锚点调整其框架,另一个保持在旧位置。

如果您希望它们位于同一点,则需要在编辑锚点后重置它们的框架,或者根本不设置锚点。

本指南解释了有关锚点的更多信息。

于 2012-08-31T03:25:22.880 回答