layoutSubview重置UILabel的属性

时间:2013-02-26 03:33:23

标签: ios objective-c uiscrollview layoutsubviews

我有一个带有UIScrollView的ViewController。在这个VC上,我以编程方式调整滚动视图内的UILabel的帧。这是在viewDidLoad上完成的。这个UILabel来自VC的xib文件,它不是以编程方式创建的,只是它的框架发生了变化。

当我从这个VC转换到另一个VC,然后返回时,UILabel的帧被重置为XIB的状态。然而,它的文本没有重置,它保持与我之前设置的文本相同。

我的调查告诉我,这发生在layoutSubviews上,因为UILabel的属性在willLayoutSubviews上是正确的,然后在回到VC时重置didLayoutSubviews。

这是预期的行为吗?有没有理由为什么标签的文本仍然存在,但框架被重置?这是因为UIScrollView在滚动时会在其父视图上调用layoutSubviews吗?

由于

1 个答案:

答案 0 :(得分:2)

我在你的描述中看到两个问题。首先,你这样说:

  

在这个VC上,我以编程方式调整滚动视图内的UILabel的帧。这是在viewDidLoad上完成的。

修改viewDidLoad中的视图帧通常是个坏主意,因为系统的布局阶段(发送layoutSubviews消息期间)尚未发生。在viewDidLoad中,您的视图框架尚未根据当前设备的屏幕尺寸和界面方向进行调整。

其次,你说你正在使用自动布局。自动布局系统在布局阶段设置视图帧。布局阶段可以由许多不同的事件触发,包括(如您所见)视图的外观和消失。

为了调整标签的框架“棒”,您需要修改控制标签框架的约束。一种方法是在视图控制器上为需要修改的每个约束创建类型为NSLayoutConstraint的插座,并将这些插座连接到xib中的约束。然后在视图控制器的viewWillLayoutSubviews中,您可以根据需要修改每个约束的constant属性。 (具有讽刺意味的是,constantNSLayoutConstraint唯一可修改的属性。)