我有一个带框架(50, 50, 100, 100)
的UIView对象。
在这个视图对象上,我添加了一个带有框架(50, 50, 50, 10)
的标签
然后我正在更改定位点from default
(0.5, 0.5) to (1.0, 0.5)
但令人惊讶的是,之后框架发生了变化。以下是相同
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 :(得分:2)
frame
的{{1}}是基于UIView
和center
属性的派生数量。如果您更改bounds
或center
,则bounds
会相应调整。同样,更改frame
会根据需要调整frame
和/或center
。
好的,这很好,除了你要更改图层的bounds
。当您更改图层的anchorPoint
时,会更改图层的中心点,从而更改UIView的中心点,然后更改框架。因此,标签会移动。
答案 1 :(得分:2)
CALayer有四个属性可确定它在超级图层中的显示位置: 位置(与视图的中心属性相同) 边界(实际上只是边界的大小部分) anchorPoint 转变 您会注意到该框架不是其中一个属性。 frame属性实际上是从这些属性派生的。设置frame属性时,图层实际上会根据您提供的帧和图层的现有anchorPoint更改其center和bounds.size。
你创建第一层(通过创建第一个UILabel,它是UIView的子类,每个UIView都有一个层),给它一个50,50,50,10的帧。该图层的默认锚点为0.5,0.5。因此它将其边界计算为0,0,50,10,其位置为75,55。
默认情况下,anchorPoint和位置重合。 如果我们将anchorPoint更改为1,0.5,它将改变位置,因此中心也将改为100,55。但不是移动中心/位置,而是移动标签框架。因此,如果我们希望75,55作为新的anchorPoint在1,1,我们将不得不将帧移动-25,0(75,55 - 100,55)。因此框架从控制台输出给出的更改。 锚点移位前0标签的标签框为{{50,50},{50,10}} 锚点移位后0标签的标签框为{{25,50},{50,10}}