2

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

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

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

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

谢谢

4

1 回答 1

2

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

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

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

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

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

于 2013-02-26T21:10:17.983 回答