如何在改变锚点时改变UILabel的框架

时间:2014-05-21 22:17:56

标签: ios objective-c cocoa-touch

我有一个带框架(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}}

2 个答案:

答案 0 :(得分:2)

frame的{​​{1}}是基于UIViewcenter属性的派生数量。如果您更改boundscenter,则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}}