为什么我的视图在更改anchorPoint后设置框架时会移动?
我做了UILabel
两个实例,并将它们添加到我的ViewController
的视图。 然后我把anchorPoint
从0.5改为1.0(x和y)。
接下来,我将uiLabel2
的框架重置为其创build的框架(100,100,100,20)。
当我运行应用程序时, uiLabel1
和uiLabel2
显示在不同的位置。 为什么?
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
属性相同) - (实际上只是
bounds
的size
部分) -
anchorPoint
-
transform
你会注意到frame
不是这些属性之一。 frame
属性实际上是从这些属性派生的。 设置frame
属性时,图层实际上会根据您提供的框架和图层的现有anchorPoint
更改其center
和bounds.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设置框架。
既然你只是重新设定一个标签的框架,一个基于新的锚点调整其框架,另一个停留在旧的位置。
如果你想让它们在同一个点上,那么你需要在编辑定位点之后为它们重新设置框架,或者根本不要定位。
本指南解释更多关于定位点。